多线程-线程间通信-多生产者多消费者问题解决(notifyAll)

1 package multithread4;
2
3 /*
4 * 生产者,消费者。
5 *
6 * 多生产者,多消费者的问题。
7 *
8 * if判断标记,只有一次,会导致不该运行的线程运行了。出现了数据错误的情况。
9 * while判断标记,解决了线程获取执行权后,是否要运行!
10 *
11 * notify:只能唤醒一个线程,如果本方唤醒了本方,没有意义。而且while判断标记+notify会产生死锁
12 * notifyAll解决了,本方线程一定会唤醒对方线程
13 *
14 * 死锁 四个线程都等待没有被唤醒也是一种情况,悬挂
15 */
16
17 class Resource2{
18 private String name;
19 private int count = 1;
20 private boolean flag = false;
21 public synchronized void set(String name) {
22
23 /*if*/ while (flag) {
24 try {
25 this.wait();
26 } catch (InterruptedException e) {
27
28 }
29 }
30 this.name = name + count;
31 count++;
32 System.out.println(Thread.currentThread().getName()+"..生产者.."+this.name);
33 flag = true;
34 // notify();
35 notifyAll();
36 }
37 public synchronized void out() {
38 /*if*/ while (!flag) {
39 try {
40 this.wait();
41 } catch (InterruptedException e) {
42
43 }
44 }
45 System.out.println(Thread.currentThread().getName()+"..消费者......"+this.name);
46 flag = false;
47 // notify();
48 notifyAll();//为了解决死锁 将其余三个都唤醒
49 }
50 }
51
52 class Producer implements Runnable{
53 private Resource2 r;
54 public Producer(Resource2 r) {
55 this.r = r;
56 }
57 public void run() {
58 while(true) {
59 r.set("烤鸭");
60 }
61 }
62 }
63 class Consumer implements Runnable{
64 private Resource2 r;
65 public Consumer(Resource2 r) {
66 this.r = r;
67 }
68 public void run() {
69 while(true) {
70 r.out();
71 }
72 }
73 }
74 public class ProducerConsumerDemo {
75
76 public static void main(String[] args) {
77
78 Resource2 r = new Resource2();
79 Producer pro = new Producer(r);
80 Consumer con = new Consumer(r);
81
82 Thread t0 = new Thread(pro);
83 Thread t1 = new Thread(pro);
84 Thread t2 = new Thread(con);
85 Thread t3 = new Thread(con);
86
87 t0.start();
88 t1.start();
89 t2.start();
90 t3.start();
91 }
92
93 }
ProducerConsumerDemo
多线程-线程间通信-多生产者多消费者问题解决(notifyAll)的更多相关文章
- 多线程-线程间通信-多生产者多消费者问题(JDK1.5后Lock,Condition解决办法及开发中代码范例)
1 package multithread4; 2 3 import java.util.concurrent.locks.Condition; 4 import java.util.concurre ...
- Java多线程——线程间通信
Java多线系列文章是Java多线程的详解介绍,对多线程还不熟悉的同学可以先去看一下我的这篇博客Java基础系列3:多线程超详细总结,这篇博客从宏观层面介绍了多线程的整体概况,接下来的几篇文章是对多线 ...
- Python多线程,线程死锁及解决,生产者与消费者问题
1.Thread类 普通调用 t = Thread(target=test, args=(i,)) # test为目标函数名, 若函数需要参数将其以元组形 # 式赋给args, 若无参数可不写 t.s ...
- 多线程 线程间通信 wait,notify
1. 方法wait锁释放,notify()锁不释放
- java多线程:线程间通信——生产者消费者模型
一.背景 && 定义 多线程环境下,只要有并发问题,就要保证数据的安全性,一般指的是通过 synchronized 来进行同步. 另一个问题是,多个线程之间如何协作呢? 我们看一个仓库 ...
- linux 信号量sem实现 生产者—消费者(线程间通信)
#include<pthread.h> #include<stdlib.h> #include<stdio.h> #include<unistd.h> ...
- java多线程与线程间通信
转自(http://blog.csdn.net/jerrying0203/article/details/45563947) 本文学习并总结java多线程与线程间通信的原理和方法,内容涉及java线程 ...
- Java——多线程之线程间通信
Java多线系列文章是Java多线程的详解介绍,对多线程还不熟悉的同学可以先去看一下我的这篇博客Java基础系列3:多线程超详细总结,这篇博客从宏观层面介绍了多线程的整体概况,接下来的几篇文章是对多线 ...
- Java多线程编程(6)--线程间通信(下)
因为本文的内容大部分是以生产者/消费者模式来进行讲解和举例的,所以在开始学习本文介绍的几种线程间的通信方式之前,我们先来熟悉一下生产者/消费者模式. 在实际的软件开发过程中,经常会碰到如下场景 ...
随机推荐
- 【LeetCode】1013. Pairs of Songs With Total Durations Divisible by 60 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...
- 【LeetCode】778. Swim in Rising Water 水位上升的泳池中游泳(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 题目地址: https://leetcode.com/problems/swim-in- ...
- 【LeetCode】77. Combinations 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 方法一:递归 方法二:回溯法 日期 题目地址:htt ...
- 【剑指Offer】二进制中1的个数 解题报告(Python)
题目地址:https://www.nowcoder.com/ta/coding-interviews 题目描述 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 解题方法 这个题如果使 ...
- LeetCode1239串联字符串的最大长度
题目 给定一个字符串数组 arr,字符串 s 是将 arr 某一子序列字符串连接所得的字符串,如果 s 中的每一个字符都只出现过一次,那么它就是一个可行解. 请返回所有可行解 s 中最长长度. 解题 ...
- 牛客练习赛44 C:小y的质数
链接:https://ac.nowcoder.com/acm/contest/634/C?tdsourcetag=s_pcqq_aiomsg 来源:牛客网 题目描述 给出一个区间\([L,R]\),求 ...
- 洛谷——P1980 [NOIP2013 普及组] 计数问题
题目描述 试计算在区间 11 到 nn的所有整数中,数字x(0 ≤ x ≤ 9)x(0≤x≤9)共出现了多少次?例如,在 11到1111中,即在 1,2,3,4,5,6,7,8,9,10,111,2, ...
- ☕【难点攻克技术系列】「海量数据计算系列」如何使用BitMap在海量数据中对相应的进行去重、查找和排序
BitMap(位图)的介绍 BitMap从字面的意思,很多人认为是位图,其实准确的来说,翻译成基于位的映射,其中数据库中有一种索引就叫做位图索引. 在具有性能优化的数据结构中,大家使用最多的就是has ...
- CS5211替代LT7211 DP转LVDS芯片方案 替代龙迅LT7211方案
LT7211是一种用于虚拟现实/显示应用的高性能C/DP1.2至LVDS芯片方案.LT7211支持DP1.2输入,LT7211可以配置为1.2.4车道,还支持车道交换功能.自适应均衡使其适用于长电缆应 ...
- Drools的Eclipse_IDEA插件安装
1.说明 Drools使用时不是必须依赖插件的, 只是在安装了相应的插件之后, 在开发工具中能识别到对应的drools文件, 能够进行一些智能提示. 以及使用插件提供的便捷功能. 2.Eclipse插 ...