在某些情况下,主线程创建并启动了子线程,如果子线程中需要进行大量的耗时运算,主线程往往将早于子线程结束之前结束,如果主线程想等待子线程执行完毕后,获得子线程中的处理完的某个数据,就要用到join方法了,方法join()的作用是等待线程对象呗销毁。
[java]
1. public class Test {
2.
3. public static class MyThread extends Thread {
4. @Override
5. public void run() {
6.
7. try {
8. int m = (int) (Math.random() * 10000);
9. "我在子线程中会随机睡上0-9秒,时间为="+m);
10. Thread.sleep(m);
11. catch (InterruptedException e) {
12. e.printStackTrace();
13. }
14. }
15. }
16. public static void main(String[] args) throws InterruptedException {
17. new MyThread();
18. myThread.start();
19. myThread.join();
20. "正常情况下肯定是我先执行完,但是加入join后,main主线程会等待子线程执行完毕后才执行");
21. }
22. }
结果为:
我在子线程中会随机睡上0-9秒,时间为=9566
正常情况下肯定是我先执行完,但是加入join后,main主线程会等待子线程执行完毕后才执行
在主线程中,加入了myThread.join(); 把谁加入了就要等谁。
同时join还有join(millis)方法,可以加入等待时间,效果上类似sleep,但是还是有实际区别的。
join底层是wait方法,所以它是会释放对象锁的,而sleep在同步的方法中是不释放对象锁的,只有同步方法执行完毕,其他线程才可以执行。
使用场景
曾经做过一个联通的增值业务项目,其中有一个业务需要给联通方暴漏接口,他们调用我们的接口,我们进行业务处理后,再返回结果,接口要求是同步的,实时返回。如果异步的就可以用消息队列解决了,把整个业务逻辑中比较费时间的都放在了子线程中运行,子线程跑完后在交由主线程返回结果。当时用的是java中的栅栏 CyclicBarrier ,现在想想用join也是可以实现的。