zoukankan      html  css  js  c++  java
  • JAVA-初步认识-第十四章-线程间通信-多生产者多消费者问题解决

    一.

    while的出现为了使得活过来的线程,回过来判断标记用的。可是t0醒来后,唤醒的是自己一方的线程,把本方唤醒后再判断标记,本方也就睡着了,对方没有被唤醒过,大家都睡着了。

    我们希望什么,t0在唤醒的时候,至少能够唤醒一个对方,没有对方才导致我们的程序死锁。怎么唤醒对方?没有这个方法。notify唤醒的是任意一个线程,并非指定的。无法做到特定唤醒,我们就直接全部唤醒,notifyAll。t0活着的时候,t1和t2全是wait的,讲这三个线程全部唤醒,本方醒了判断标记会停止,而对方醒了判断标记会继续执行。对方能醒两个,只有一个能工作,没有什么问题。因此,将程序中的notify()方法,改为notifyAll()。

    改进后的程序编译运行没有任何问题,至此多生产多消费的问题就解决了。

    二. 通过图例的形式讲述整个程序

    这部分讲述非常的精彩,具体的过程看视频。整个流程就是集中在if和while,notify和notifyAll,死锁....等一系列问题。

     

    (我的部分理解,对于视频中的讲解,每次唤醒的线程是随机的,如果是全部唤醒的话,相当于都有了资格,都来争取执行权。如果又有线程被冻结了,那么剩下的线程继续争夺执行权)

    现在有人提出,由于notifyAll的存在,到底程序的效率降低。将本方线程也唤醒,本方还要判断标记,再次冻结。后期多线程的架构中提供了一些解决方案。升级以后解决的,没升级前就是这样的。

  • 相关阅读:
    python数据分析——numpy数组学习(2)
    python数据分析——numpy数组学习(2)
    python数据分析——numpy数组学习
    python数据分析——numpy数组及其运算
    python基础学习——列表与列表表达式
    python基础学习——列表与列表表达式
    各国国土面积、军队数量、GDP总计数据分析
    爬取起点月票榜
    《战争艺术概论》词云
    影评网站-团队博客目录
  • 原文地址:https://www.cnblogs.com/wsw-bk/p/8056576.html
Copyright © 2011-2022 走看看