JAVA多线程 join() 方法详解及应用场景

来源:互联网 发布:星矢和纱织 知乎 编辑:程序博客网 时间:2024/05/29 16:38

在某些情况下,主线程创建并启动了子线程,如果子线程中需要进行大量的耗时运算,主线程往往将早于子线程结束之前结束,如果主线程想等待子线程执行完毕后,获得子线程中的处理完的某个数据,就要用到join方法了,方法join()的作用是等待线程对象呗销毁。

public class Test {public static class MyThread extends Thread {@Overridepublic 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主线程会等待子线程执行完毕后才执行

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

同时join还有join(millis)方法,可以加入等待时间,效果上类似sleep,但是还是有实际区别的。


join底层是wait方法,所以它是会释放对象锁的,而sleep在同步的方法中是不释放对象锁的,只有同步方法执行完毕,其他线程才可以执行。


使用场景

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

0 0
原创粉丝点击