在某些状况下,主线程建立并启动了子线程,若是子线程中须要进行大量的耗时运算,主线程每每将早于子线程结束以前结束,若是主线程想等待子线程执行完毕后,得到子线程中的处理完的某个数据,就要用到join方法了,方法join()的做用是等待线程对象呗销毁。java

public class Test {
public static class MyThread extends Thread {
@Override
public void run() {
try {
int m = (int) (Math.random() * 10000);
System.out.println("我在子线程中会随机睡上0-9秒,时间为="+m);
Thread.sleep(m);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) throws InterruptedException {
MyThread myThread =new MyThread();
myThread.start();
myThread.join();
System.out.println("正常状况下确定是我先执行完,可是加入join后,main主线程会等待子线程执行完毕后才执行");
}
}

结果为:

我在子线程中会随机睡上0-9秒,时间为=9566

正常状况下确定是我先执行完,可是加入join后,main主线程会等待子线程执行完毕后才执行dom

在主线程中,加入了myThread.join();  把谁加入了就要等谁。异步

同时join还有join(millis)方法,能够加入等待时间,效果上相似sleep,可是仍是有实际区别的。ide

join底层是wait方法,因此它是会释放对象锁的,而sleep在同步的方法中是不释放对象锁的,只有同步方法执行完毕,其余线程才能够执行。spa

使用场景线程

曾经作过一个联通的增值业务项目,其中有一个业务须要给联通方暴漏接口,他们调用咱们的接口,咱们进行业务处理后,再返回结果,接口要求是同步的,实时返回。若是异步的就能够用消息队列解决了,吧整个业务逻辑中比较费时间的都放在了子线程中运行,子线程跑完后在交由主线程返回结果。当时用的是java中的栅栏 CyclicBarrier ,如今想一想用join也是能够实现的。

code