4.1.8ReentrantLock实现生产者消费者模式(多对多)
来源:互联网 发布:龚琳娜 知乎 编辑:程序博客网 时间:2024/05/29 19:23
package demo;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.ReentrantLock;/** * Created by sunyifeng on 17/10/18. */public class MyService { private ReentrantLock lock = new ReentrantLock(); private Condition condition = lock.newCondition(); private boolean hasValue = false; // public void set(){ try { lock.lock(); while (hasValue == true) { System.out.println("AAAAAA"); condition.await(); } System.out.println("aaaaaa"); hasValue = true; condition.signalAll(); // FIXME:用signal()出现假死 } catch (InterruptedException e) { e.printStackTrace(); }finally { lock.unlock(); } } // public void get(){ try { lock.lock(); while (hasValue == false) { System.out.println("BBBBBB"); condition.await(); } System.out.println("bbbbbb"); hasValue = false; condition.signalAll(); // FIXME:用signal()出现假死 } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); } }}
package demo;/** * Created by sunyifeng on 17/10/18. */public class ThreadA extends Thread { private MyService myService; public ThreadA(MyService myService) { super(); this.myService = myService; } @Override public void run() { super.run(); for (int i = 0; i < 3; i++) { myService.set(); } }}
package demo;/** * Created by sunyifeng on 17/10/18. */public class ThreadB extends Thread { private MyService myService; public ThreadB(MyService myService) { super(); this.myService = myService; } @Override public void run() { super.run(); for (int i = 0; i < 3; i++) { myService.get(); } }}
package demo;/** * Created by sunyifeng on 17/10/18. */public class Run { public static void main(String[] args) { MyService myService = new MyService(); ThreadA[] threadA = new ThreadA[10]; ThreadB[] threadB = new ThreadB[10]; for (int i = 0; i < 3; i++) { threadA[i] = new ThreadA(myService); threadB[i] = new ThreadB(myService); threadA[i].start(); threadB[i].start(); } }}
运行结果:aaaaaa
AAAAAA
bbbbbb
BBBBBB
aaaaaa
AAAAAA
AAAAAA
bbbbbb
BBBBBB
aaaaaa
AAAAAA
bbbbbb
aaaaaa
AAAAAA
bbbbbb
BBBBBB
aaaaaa
AAAAAA
bbbbbb
BBBBBB
aaaaaa
bbbbbb
BBBBBB
aaaaaa
AAAAAA
bbbbbb
BBBBBB
aaaaaa
AAAAAA
bbbbbb
BBBBBB
aaaaaa
bbbbbb
程序分析:
打印结果是交替出现,但是不是有规律的交替出现,原因是程序中只使用了一个condition对象,唤醒signlAll()方法唤醒的有可能是同类,所以打印的有各种可能。
阅读全文
0 0
- 4.1.8ReentrantLock实现生产者消费者模式(多对多)
- 4.1.7ReentrantLock实现生产者消费者模式(1对1)
- ReentrantLock方式实现生产者-消费者模式
- 使用ReentrantLock实现生产者消费者模式
- java多线程--ReentrantLock实现生产者与消费者模式
- 多消费者,多生产者模式Java实现
- 生产者消费者模式,并发采用ReentrantLock
- synchronized和ReentrantLock实现消费者生产者问题
- 生产者消费者模式实现
- 生产者消费者模式实现
- 实现生产者-消费者模式
- 生产者消费者模式实现
- 生产者消费者模型[多生产者-多消费者模式]
- 生产者消费者多缓冲区实现
- java 用多线程实现多生产者和多消费者模式
- 生产者-消费者模式(阻塞队列实现)
- 消费者-生产者模式(线程的实现)
- Java多线程编程4--Lock的实例--实现生产者/消费者模式:一对一、多对多交替打印
- redis 入门
- 【UVA12083】Guardian of Decency
- 2018百度校招、腾讯校招 面试经验
- 计算单词个数
- 作业
- 4.1.8ReentrantLock实现生产者消费者模式(多对多)
- 文章标题
- apache无法启动问题的解决
- 如何高效学习的收获
- WebSocket机制,以及与Http不同
- bzoj-1975 魔法猪学院 k短路
- 详尽!Ubuntu16.04LTS安装Matlab2016b!
- CorelDRAW 折扇效果实例教程学会了就顶学几年了
- 3个简单的c程序