首页 » SEO优化 » php多线程假逝世技巧_一个常见的java多线程通信问题假去世现象

php多线程假逝世技巧_一个常见的java多线程通信问题假去世现象

duote123 2024-11-07 0

扫一扫用手机浏览

文章目录 [+]

一、假去世征象重现

为了更好地演示我们的实例,我们利用生产者消费者模式,一边生产一边消费。

php多线程假逝世技巧_一个常见的java多线程通信问题假去世现象

下面我们先试其实现一下。
这个例子的功能描述如下:

php多线程假逝世技巧_一个常见的java多线程通信问题假去世现象
(图片来自网络侵删)
有一个产品a,生产方法生产a,消费方法消费a。
然后10个生产线程生产,10个消费线程消费。
永一直息。

上面的流程很清晰,一堆线程生产,生产了之后notify消费者去消费。
上面的图指的是一堆线程生产,一堆线程消费,可能箭头画的指示的一个。

第一步:定义变量

第二步:生产和消费方法(定义在上面的类中)

首先是生产方法

然后是消费方法

第三步:测试

上面这个例子的功能,在一开始也已经解释了,这里produce和consume方法中,利用的是wait/notify机制来实现的,我们运行一下看会涌现什么结果:

我们看到,本来全体程序是永一直歇的,但是在生产了6个产品之后,溘然间就停歇了,也便是我们本日的主题,多线程通信涌现了假去世状态。
为什么会涌现这种征象呢?我们来剖析一下缘故原由。

二、假去世状态剖析

实在涌现这个征象的缘故原由很大略,那便是和我们的wait/notify机制有关,我们几句话来总结一下:

“假去世”的征象便是全部线程都进入了WAITING状态(去世锁),则程序就不再实行任何业务功能了,全体项目呈停滞状态。
上面的案例中涌现假去世的征象是由于仅仅唤醒了同类(生产者唤醒了生产者,消费者唤醒了消费者)的征象大量涌现导致的。

下面我们画一张图来剖析一下:

打开UC浏览器 查看更多精彩图片

也便是说notify关照的是是同类。
造成了这种堵塞征象。
这是其根本缘故原由,而且这张图是我们自己画的。
下面我们就直策应用jstack工具来剖析一下线程的状态。
这两个工具是jdk自带的,我们可以直策应用。

第一步:利用jps查看当前电脑存在的所有java线程

第二步:利用jstack工具查看线程状态信息

现在我们知道了,目前所有的线程都是出于等待的状态,这也便是假去世征象的验证。

假去世征象的缘故原由我们知道了,那么我们如何改正呢?

三、假去世状态修复

假去世征象的改正实在很大略,网上的办法大概多,比如说通过BlockingQueue或者是notifyAll方法。
notifyAll方法超级大略,便是把上面produce和consume方法中的notify改成notifyAll方法即可。
目的便是关照到所有的其他线程,生产线程该生产的生产,消费线程该消费的消费。

感谢支持。
OK,本日的文章先到这。

标签:

相关文章