版权声明:
本公众号发布的所有文章,均属于原创,版权归本公众号所有。
允许有条件转载,转载请附带底部二维码。
一、前言
在多线程的应用中,通常我们开启一个线程就是为了让其做一些耗时的操作。例如:在Android中,网络或者IO的操作,都应该交给子线程去完成任务。这样就会出现,一个线程需要开启并且等待另外一个线程执行结束的情况。比如在子线程中处理了一堆复杂的计算,而主线程需要等待这个复杂计算的结果,这个时候,就需要用到Java多线程技术中的join()
方法了。
二、join()方法
1、什么是join()方法
join()
方法的作用是,让被调用的线程正常执行run()
方法中的任务,而使当前调用的线程处于阻塞状态,直到等待被调用过join()
线程执行完成后,再继续自行。
Join有点像把一个异步操作,拉成同步的去运行。
join()
方法就像是要送情郎去战场的痴情少女一样,你放心去吧,我等你。
从上面的例子可以看出来,主线程在调用了joinThread.join()
之后,就一直处于阻塞状态,直到joinThread执行完毕,才会继续执行下去。
2、join()方法都干了什么?
在Java提供的Thread中,和join()
相关的API里,其实和wait一样,存在多个方法。
join():等待调用的线程被执行完毕。
join(timeout):和join()一样,只是设定了一个超时时间。
join(timeout,nanos):和join(timeout)一样,只是超时的时间跟精准了。
join虽然提供了三个方法,其实就是对一些例外情况做了处理,有一个超时的机制。上面说join是一个痴情的女子,你放心去吧,我等你。那么join(timeOut)就是,我等你,但是只等你三年。
从源码的角度来说,join()内部其实依然调用的是join(timeout),只是这个timeout为0.
这样的话,我们只需要着重关注join(timeout)的实现即可。
可以看到join其实内部也是调用的wait来做等待操作的,这样的实现,决定了join是会释放锁的,也就是在等待期间,不会独占锁资源,会让出锁资源给其他线程使用。
3、join的异常处理
从上面的源码里也可以看出来,join在调用的时候,是可能会抛出InterruptedException异常的。那么,利用interruptedException就可以来处理一些异常情况。
1、士兵出事了,少女怎么办?
接上面的例子,如果士兵线程在执行的过程中,被停止了,那么少女线程会怎么办?
可以看到,士兵线程如果出现异常被停止,依然会向外抛出InterruptException异常情况,所以我们捕获InterruptException即可。
2、少女出现意外了,士兵怎么办?
可以看到,如果少女出现意外不能等待,但是士兵线程并不会知道家乡的情况,还是会继续执行任务,直到自己执行完成。
三、小结
写个Thread.join()的使用,硬生生被写成了爱情故事,结果还是双结局。有点伤感,希望大家的爱情故事里,都有完美的结局,能等到自己心爱的人归来,能不让等待的人失望。