1. 1 package multithread4;
  2. 2
  3. 3 /*
  4. 4 * 生产者,消费者。
  5. 5 *
  6. 6 * 多生产者,多消费者的问题。
  7. 7 *
  8. 8 * if判断标记,只有一次,会导致不该运行的线程运行了。出现了数据错误的情况。
  9. 9 * while判断标记,解决了线程获取执行权后,是否要运行!
  10. 10 *
  11. 11 * notify:只能唤醒一个线程,如果本方唤醒了本方,没有意义。而且while判断标记+notify会产生死锁
  12. 12 * notifyAll解决了,本方线程一定会唤醒对方线程
  13. 13 *
  14. 14 * 死锁 四个线程都等待没有被唤醒也是一种情况,悬挂
  15. 15 */
  16. 16
  17. 17 class Resource2{
  18. 18 private String name;
  19. 19 private int count = 1;
  20. 20 private boolean flag = false;
  21. 21 public synchronized void set(String name) {
  22. 22
  23. 23 /*if*/ while (flag) {
  24. 24 try {
  25. 25 this.wait();
  26. 26 } catch (InterruptedException e) {
  27. 27
  28. 28 }
  29. 29 }
  30. 30 this.name = name + count;
  31. 31 count++;
  32. 32 System.out.println(Thread.currentThread().getName()+"..生产者.."+this.name);
  33. 33 flag = true;
  34. 34 // notify();
  35. 35 notifyAll();
  36. 36 }
  37. 37 public synchronized void out() {
  38. 38 /*if*/ while (!flag) {
  39. 39 try {
  40. 40 this.wait();
  41. 41 } catch (InterruptedException e) {
  42. 42
  43. 43 }
  44. 44 }
  45. 45 System.out.println(Thread.currentThread().getName()+"..消费者......"+this.name);
  46. 46 flag = false;
  47. 47 // notify();
  48. 48 notifyAll();//为了解决死锁 将其余三个都唤醒
  49. 49 }
  50. 50 }
  51. 51
  52. 52 class Producer implements Runnable{
  53. 53 private Resource2 r;
  54. 54 public Producer(Resource2 r) {
  55. 55 this.r = r;
  56. 56 }
  57. 57 public void run() {
  58. 58 while(true) {
  59. 59 r.set("烤鸭");
  60. 60 }
  61. 61 }
  62. 62 }
  63. 63 class Consumer implements Runnable{
  64. 64 private Resource2 r;
  65. 65 public Consumer(Resource2 r) {
  66. 66 this.r = r;
  67. 67 }
  68. 68 public void run() {
  69. 69 while(true) {
  70. 70 r.out();
  71. 71 }
  72. 72 }
  73. 73 }
  74. 74 public class ProducerConsumerDemo {
  75. 75
  76. 76 public static void main(String[] args) {
  77. 77
  78. 78 Resource2 r = new Resource2();
  79. 79 Producer pro = new Producer(r);
  80. 80 Consumer con = new Consumer(r);
  81. 81
  82. 82 Thread t0 = new Thread(pro);
  83. 83 Thread t1 = new Thread(pro);
  84. 84 Thread t2 = new Thread(con);
  85. 85 Thread t3 = new Thread(con);
  86. 86
  87. 87 t0.start();
  88. 88 t1.start();
  89. 89 t2.start();
  90. 90 t3.start();
  91. 91 }
  92. 92
  93. 93 }

ProducerConsumerDemo

多线程-线程间通信-多生产者多消费者问题解决(notifyAll)的更多相关文章

  1. 多线程-线程间通信-多生产者多消费者问题(JDK1.5后Lock,Condition解决办法及开发中代码范例)

    1 package multithread4; 2 3 import java.util.concurrent.locks.Condition; 4 import java.util.concurre ...

  2. Java多线程——线程间通信

    Java多线系列文章是Java多线程的详解介绍,对多线程还不熟悉的同学可以先去看一下我的这篇博客Java基础系列3:多线程超详细总结,这篇博客从宏观层面介绍了多线程的整体概况,接下来的几篇文章是对多线 ...

  3. Python多线程,线程死锁及解决,生产者与消费者问题

    1.Thread类 普通调用 t = Thread(target=test, args=(i,)) # test为目标函数名, 若函数需要参数将其以元组形 # 式赋给args, 若无参数可不写 t.s ...

  4. 多线程 线程间通信 wait,notify

    1. 方法wait锁释放,notify()锁不释放

  5. java多线程:线程间通信——生产者消费者模型

    一.背景 && 定义 多线程环境下,只要有并发问题,就要保证数据的安全性,一般指的是通过 synchronized 来进行同步. 另一个问题是,多个线程之间如何协作呢? 我们看一个仓库 ...

  6. linux 信号量sem实现 生产者—消费者(线程间通信)

    #include<pthread.h> #include<stdlib.h> #include<stdio.h> #include<unistd.h> ...

  7. java多线程与线程间通信

    转自(http://blog.csdn.net/jerrying0203/article/details/45563947) 本文学习并总结java多线程与线程间通信的原理和方法,内容涉及java线程 ...

  8. Java——多线程之线程间通信

    Java多线系列文章是Java多线程的详解介绍,对多线程还不熟悉的同学可以先去看一下我的这篇博客Java基础系列3:多线程超详细总结,这篇博客从宏观层面介绍了多线程的整体概况,接下来的几篇文章是对多线 ...

  9. Java多线程编程(6)--线程间通信(下)

      因为本文的内容大部分是以生产者/消费者模式来进行讲解和举例的,所以在开始学习本文介绍的几种线程间的通信方式之前,我们先来熟悉一下生产者/消费者模式.   在实际的软件开发过程中,经常会碰到如下场景 ...

随机推荐

  1. JAVA结合Redis处理缓存穿透问题

    public List<WeixinMenu> getList() { List<WeixinMenu> weixinMenuList= (List<WeixinMenu ...

  2. 【LeetCode】90. Subsets II 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 递归 回溯法 日期 题目地址:https://leet ...

  3. codeforce -602B Approximating a Constant Range(暴力)

    B. Approximating a Constant Range time limit per test 2 seconds memory limit per test 256 megabytes ...

  4. Loss Landscape Sightseeing with Multi-Point Optimization

    目录 概 主要内容 代码 Skorokhodov I, Burtsev M. Loss Landscape Sightseeing with Multi-Point Optimization.[J]. ...

  5. 【Azure 应用服务】探索在Azure上设置禁止任何人访问App Service的默认域名(Default URL)

    问题描述 总所周知,Azure App Service服务会默认提供一个 ***.chinacloudsites.cn为后缀的域名,但是该域名由上海蓝云网络科技有限公司备案,仅用于向其客户提供 Azu ...

  6. 想看Vue文档,cn放错位置,误入xx网站...

    昨晚,DD在微信群(点击加入)里看到有小伙伴说,想去Vue官网看中文文档,不当心把cn写错了位置,结果进入了xx网站... 老司机们应该都知道,Vue官网的中文文档地址是:https://cn.vue ...

  7. 基于Spring MVC + Spring + MyBatis的【医院就诊挂号系统】

    资源下载:https://download.csdn.net/download/weixin_44893902/21727306 一.语言和环境 1.实现语言: JAVA语言. 2.环境要求: MyE ...

  8. MySQL数据库基础(4)SELECT 数据查询

    目录 一.SELECT 选择列表 二.MySQL 运算符 三.定制显示查询结果 四.模糊查询 一.SELECT 选择列表 1.语法 SELECT <COLUMN1, COLUMN2, COLUM ...

  9. Storm集群安装Version1.0.1

    Storm集群安装,基于版本1.0.1, 使用apache-storm-1.0.1.tar.gz安装包. 1.安装规划 角色规划 IP/机器名 安装软件 运行进程 nimbus zdh-237 sto ...

  10. Hive安装Version2.1.0

    Hive安装,基于版本2.1.0, 使用apache-hive-2.1.0-bin.tar.gz安装包. 1.安装规划 角色规划 IP/机器名 安装软件 运行进程 hive zdh-9 hive Ru ...