Welcome 微信登录

首页 / 软件开发 / JAVA / Java多线程:“基础篇”08之join()

Java多线程:“基础篇”08之join()2014-06-02 cnblogs skywang123451. join()介绍

join() 定义在Thread.java中。

join() 的作用:让“主线程”等待“子线程 ”结束之后才能继续运行。这句话可能有点晦涩,我们还是通过例子去理解:

// 主线程public class Father extends Thread {public void run() {Son s = new Son();s.start();s.join();...}}// 子线程public class Son extends Thread {public void run() {...}}
说明:

上面的有两个类Father(主线程类)和Son(子线程类)。因为Son是在Father中创建并启动的, 所以,Father是主线程类,Son是子线程类。

在Father主线程中,通过new Son()新建“子线程 s”。接着通过s.start()启动“子线程s”,并且调用s.join()。在调用s.join()之后, Father主线程会一直等待,直到“子线程s”运行完毕;在“子线程s”运行完毕之 后,Father主线程才能接着运行。 这也就是我们所说的“join()的作用,是让主线程会等待子线程 结束之后才能继续运行”!

2. join()源码分析(基于JDK1.7.0_40)

public final void join() throws InterruptedException {join(0);}public final synchronized void join(long millis)throws InterruptedException {long base = System.currentTimeMillis();long now = 0;if (millis < 0) {throw new IllegalArgumentException("timeout value is negative");}if (millis == 0) {while (isAlive()) {wait(0);}} else {while (isAlive()) {long delay = millis - now;if (delay <= 0) {break;}wait(delay);now = System.currentTimeMillis() - base;}}}
说明:

从代码中,我们可以发现。当millis==0时,会进入while(isAlive())循环;即只要子线程 是活的,主线程就不停的等待。

我们根据上面解释join()作用时的代码来理解join()的用法!