多线程通信之Join等待

版权声明:

本公众号发布的所有文章,均属于原创,版权归本公众号所有。

允许有条件转载,转载请附带底部二维码。

一、前言

在多线程的应用中,通常我们开启一个线程就是为了让其做一些耗时的操作。例如:在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()的使用,硬生生被写成了爱情故事,结果还是双结局。有点伤感,希望大家的爱情故事里,都有完美的结局,能等到自己心爱的人归来,能不让等待的人失望。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值