P7资深架构师带你分析的Thread.join的做用和原理

P7资深架构师带你分析的Thread.join的做用和原理

 

文章简介面试

不少人对的Thread.join的做用以及实现了解得不多,毕竟这个API咱们不多使用。这篇文章仍然会结合使用及原理进行深度分析多线程

内容导航架构

  • 的Thread.join的做用
  • 的Thread.join的实现原理
  • 何时会使用的Thread.join

1、的Thread.join的做用

以前有人问过我一个这样的面试题学习

Java的中如何让多线程按照本身指定的顺序执行?this

这个问题最简单的回答是经过的Thread.join来实现,长此以往就让不少人误觉得的Thread.join是用来保证线程的顺序性的。spa

下面这段代码演示了的Thread.join的做用线程

P7资深架构师带你分析的Thread.join的做用和原理

 

上面的代码,注意部分,你们能够把这行代码注释之后看看运行效果,在没有加加盟的时候运行的结果是不肯定的。加了加入之后,运行结果按照递增的顺序展现出来。previousThread.join感兴趣的能够加入个人学习圈子:142019080 视频

的Thread.join的含义是当前线程须要等待previousThread线程终止以后才从的Thread.join返回。简单来讲,就是线程没有执行完以前,会一直阻塞在加入方法处。对象

下面的图表现了加盟对于线程的做用blog

 

P7资深架构师带你分析的Thread.join的做用和原理

 

2、的Thread.join的实现原理

线程是如何被阻塞的?又是经过什么方法唤醒的呢?先来看看的Thread.join方法作了什么事情

P7资深架构师带你分析的Thread.join的做用和原理

 

从加入方法的源码来看,加入方法的本质调用的是对象中的等待方法实现线程的阻塞,等待方法的实现原理咱们在后续的文章再说详细阐述。可是咱们须要知道的是,调用等方法必需要获取锁,因此加入方法是被同步的修饰的,同步的修饰在方法层面至关于同步(这),这就是previousThread自己的实例。

有不少人不理解加入为何阻塞的是主线程呢?不理解的缘由是阻塞主线程的方法是放在previousThread这个实例做用,让你们误觉得应该阻塞previousThread线程。实际上主线程会持有previousThread这个对象的锁,而后调用等方法去阻塞,而这个方法的调用者是在主线程中的。因此形成主线程阻塞。感兴趣的能够加入个人学习圈子:142019080

第二个问题,为何previousThread线程执行完毕就可以唤醒住线程呢?或者说是在何时唤醒的?

要了解这个问题,咱们又得翻JDK的源码,可是若是你们对线程有必定的基本了解的话,经过等方法阻塞的线程,须要经过通知或者notifyAll的来唤醒。因此在线程执行完毕之后会有一个唤醒的操做,只是咱们不须要关心。

接下来在热点的源码中找到,看看线程退出之后有没有作相关的事情来证实咱们的猜测。thread.cpp

P7资深架构师带你分析的Thread.join的做用和原理

 

一下观察这行代码上的注释,唤醒处于等待的线程对象,这个是在线程终止以后作的清理工做,这个方法的定义代码片断以下ensure_join(this)

P7资深架构师带你分析的Thread.join的做用和原理

 

ensure_join方法中,调用唤醒全部等待thread锁的线程,意味着调用了加入方法被阻塞的主线程会被唤醒;到目前为止,咱们基本上对联的原理作了一个比较详细的分析lock.notify_all(thread);

总结,的Thread.join其实底层是经过等待/ notifyAll的来实现线程的通讯达到线程阻塞的目的;当线程执行结束之后,会触发两个事情,第一个是设置本地线程对象为空时,第二个是经过notifyAll的方法,让等待在previousThread对象锁上的等待方法被唤醒。

3、何时会使用的Thread.join

在实际应用开发中,咱们不多会使用的Thread.join。在实际使用过程当中,咱们能够经过加入方法来等待线程执行的结果,其实有点相似将来/调用的功能。

咱们经过如下伪代码来讲明加入的使用场景

P7资深架构师带你分析的Thread.join的做用和原理

 

 

《架构师资料》领取方法

下图中的资料都是我精心录制视频,感兴趣的能够加入个人学习圈子:142019080 免费获取。

P7资深架构师带你分析的Thread.join的做用和原理

相关文章
相关标签/搜索