Java多线程中join方法如何使用


本篇内容主要讲解“Java多线程中join方法如何使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java多线程中join方法如何使用”吧!首先给出结论:t.join()方法只会使主线程(或者说调用t.join()的线程)进入等待池并等待t线程执行完毕后才会被唤醒。并不影响同一时刻处在运行状态的其他线程。下面则是分析过程。之前对于join()方法只是了解它能够使得t.join()中的t优先执行,当t执行完后才会执行其他线程。能够使得线程之间的并行执行变成串行执行。运行结果:A-1
B-1
B-2
B-3
A-2
B-4
A-3
B-5
A-4
A-5
可以看出A线程和B线程是交替执行的。而在其中加入join()方法后(后面的代码都略去了ThreadTest类的定义)运行结果:A-1
A-2
A-3
A-4
A-5
B-1
B-2
B-3
B-4
B-5
显然,使用t1.join()之后,B线程需要等A线程执行完毕之后才能执行。需要注意的是,t1.join()需要等t1.start()执行之后执行才有效果,此外,如果t1.join()放在t2.start()之后的话,仍然会是交替执行,然而并不是没有效果,这点困扰了我很久,也没在别的博客里看到过。为了深入理解,我们先看一下join()的源码。Aninvocationofthismethodbehavesinexactlythesame
*wayastheinvocation
*
*Thisimplementationusesaloopof{@codethis.wait}calls
*conditionedon{@codethis.isAlive}.Asathreadterminatesthe
*{@codethis.notifyAll}methodisinvoked.Itisrecommendedthat
*applicationsnotuse{@codewait},{@codenotify},or
*{@codenotifyAll}on{@codeThread}instances.
*
*@parammillis
*thetimetowaitinmilliseconds
*
*@throwsIllegalArgumentException
*ifthevalueof{@codemillis}isnegative
*
*@throwsInterruptedException
*ifanythreadhasinterruptedthecurrentthread.The
*interruptedstatusofthecurrentthreadis
*clearedwhenthisexceptionisthrown.
*/
publicfinalsynchronizedvoidjoin(longmillis)throwsInterruptedException{
longbase=System.currentTimeMillis();
longnow=0;

if(millis
可以看出,join()方法的底层是利用wait()方法实现的。可以看出,join方法是一个同步方法,当主线程调用t1.join()方法时,主线程先获得了t1对象的锁,随后进入方法,调用了t1对象的wait()方法,使主线程进入了t1对象的等待池,此时,A线程则还在执行,并且随后的t2.start()还没被执行,因此,B线程也还没开始。等到A线程执行完毕之后,主线程继续执行,走到了t2.start(),B线程才会开始执行。此外,对于join()的位置和作用的关系,我们可以用下面的例子来分析运行结果为main start
t1start
t1end
t2start
t2end
t3start
t3end
A-1
A-2
main end
C-1
C-2
C-3
C-4
C-5
A-3
B-1
B-2
B-3
B-4
B-5
A-4
A-5
A、B、C和主线程交替运行。加入join()方法后运行结果:main start
t1start
t1end
t2start
t2end
A-1
B-1
A-2
A-3
A-4
A-5
B-2
t3start
t3end
B-3
m免费云主机域名ain end
B-4
B-5
C-1
C-2
C-3
C-4
C-5
多次实验可以看出,主线程在t1.join()方法处停止,并需要等待A线程执行完毕后才会执行t3.start(),然而,并不影响B线程的执行。因此,可以得出结论,t.join()方法只会使主线程进入等待池并等待t线程执行完毕后才会被唤醒。并不影响同一时刻处在运行状态的其他线程。PS:join源码中,只会调用wait方法,并没有在结束时调用notify,这是因为线程在die的时候会自动调用自身的notifyAll方法,来释放所有的资源和锁。到此,相信大家对“Java多线程中join方法如何使用”有了更深的了解,不妨来实际操作一番吧!这里是百云主机网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

相关推荐: Nginx+PHP+FastCGI加速模式怎么实现

本篇内容介绍了“Nginx+PHP+FastCGI加速模式怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! 一、用户对动态PHP网页访问过程 用户浏览器发…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

Like (0)
Donate 微信扫一扫 微信扫一扫
Previous 08/26 13:25
Next 08/26 13:25

相关推荐