多生产者和多消费者是线程通信的经典案例,但是和生产者-消费者相比更为复杂,而且可能会产生程序假死。

public class Product {
private MyStack myStack; public Product(MyStack myStack) {
this.myStack = myStack;
} public void pushService(){
myStack.push();
}
} public class Consumer {
private MyStack myStack; public Consumer(MyStack myStack) {
this.myStack = myStack;
} public void popService(){
myStack.pop();
}
} public class ThreadP extends Thread {
private Product product; public ThreadP(Product product) {
this.product = product;
} @Override
public void run() {
while (true) {
product.pushService();
}
}
} public class ThreadC extends Thread{
private Consumer consumer; public ThreadC(Consumer consumer) {
this.consumer = consumer;
} @Override
public void run() {
while (true) {
consumer.popService();
}
}
} public class MyStack {
private List list = new ArrayList<>(); synchronized public void push() {
try {
while (list.size() == 1) {
this.wait();
}
list.add("anything=" + Math.random());
this.notifyAll();
System.out.println("push=" + list.size());
} catch (InterruptedException e) {
e.printStackTrace();
}
} synchronized public String pop() {
String returnValue = "";
try {
while (list.size() == 0) {
System.out.println("pop wait begin"+Thread.currentThread().getName());
this.wait();
}
returnValue = "" + list.size();
list.remove(0);
Thread.sleep(1000);
this.notifyAll();
System.out.println("pop end"+list.size());
} catch (InterruptedException e) {
e.printStackTrace();
}
return returnValue;
}
} /**
* Created by wangbin10 on 2018/7/10.
* 多生产多消费的情况程序运行后出现假死:
* 原因是虽然代码中已经wait/notify进行通信了,但是不能保证notify唤醒的就是是同类还是异类
* 可能会出现生产者唤醒生产者,消费者唤醒消费者的情况,长此以往,所有线程都进行等待
* 解决的办法就是将notify换成notifyAll
*/
public class Test {
public static void main(String[] args) {
MyStack myStack=new MyStack();
Product p1 = new Product(myStack);
Product p2 = new Product(myStack);
Product p3 = new Product(myStack);
Product p4 = new Product(myStack); ThreadP tp1=new ThreadP(p1);
ThreadP tp2=new ThreadP(p2);
ThreadP tp3=new ThreadP(p3);
ThreadP tp4=new ThreadP(p4); tp1.start();
tp2.start();
tp3.start();
tp4.start(); Consumer c1 = new Consumer(myStack);
Consumer c2 = new Consumer(myStack);
Consumer c3 = new Consumer(myStack);
Consumer c4 = new Consumer(myStack); ThreadC tc1 = new ThreadC(c1);
ThreadC tc2 = new ThreadC(c2);
ThreadC tc3 = new ThreadC(c3);
ThreadC tc4 = new ThreadC(c4); tc1.start();
tc2.start();
tc3.start();
tc4.start();
}
}

最新文章

  1. Android版本4.0~7.0
  2. 二叉搜索树的实现及指针问题的一点思考(C++)
  3. SQLServer: 解决&ldquo;错误15023:当前数据库中已存在用户或角色
  4. oracle 外部表
  5. 想要上市,SaaS 企业应该重点关注什么?(下)
  6. 【转】Android studio 导入github工程
  7. POJ 3579 Median(二分答案+Two pointers)
  8. Java下拼接执行动态SQL语句(转)
  9. 昨天CSAPP上的疑问的解答
  10. MONO 如何打包 .NET程序独立运行(winform篇)
  11. 用ajax判断用户是否已存在?----2017-05-12
  12. S7-200PLC间的PPI通信
  13. python之字典、列表、元组生成器的使用
  14. C. New Year and Rating 差分方程 思维
  15. 不一样的go语言-不同的OO
  16. 3d tech
  17. 8 -- 深入使用Spring -- 3...1 Resource实现类UrlResource
  18. 016-sed
  19. mydumper使用
  20. 软工之404 Note Found团队

热门文章

  1. FileReader的编码问题
  2. webpack打包不引入vue、echarts等公共库
  3. MSVC编译Boost的几种链接方式
  4. chrome浏览器***
  5. Python Tricks(二十一)—— 排列组合的计算
  6. ADO.net Connection对象简介
  7. 得知OpenCV研究报告指出系列(一)VS2010+OpenCV2.4.9环境配置
  8. Opencv决策树分类器应用
  9. 一个简单的C++性能测试工具(ms级别)
  10. Debug权限提升