问题描述:生产者和消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一个存储空间,生产者往存储空间中添加产品,消费者从存储空间中取走产品,当存储空间为空时,消费者阻塞,当存储空间满时,生产者阻塞

实现方法:使用synchronized关键字结合wait()和notify()实现

生产者代码:

 class Producer implements Runnable{

         @Override
public void run() {
// TODO Auto-generated method stub
for(int i = 1;i <= 10; i++) {
System.out.println("生产者第" + i);
try {
Thread.sleep(1000);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
synchronized (lock) {
while(count >= max) { //防止假唤醒(唤醒之后发现条件不满足)
try {
lock.wait(); //释放锁
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
count++;
System.out.println("生产者:" + Thread.currentThread().getName() + "完成生产:"+i+",当前count=" + count );
lock.notifyAll();
}
}
} }

消费者代码:

 class Consumer implements Runnable{

         @Override
public void run() {
// TODO Auto-generated method stub
for(int i = 1;i <= 10; i++) {
System.out.println("消费者第" + i);
try {
Thread.sleep(1000);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
synchronized (lock) {
while(count == 0) { //防止假唤醒(唤醒之后发现条件不满足)
try {
lock.wait(); //释放锁
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/*不要用if语句
if(count == 0) {
try {
lock.wait();
} catch (Exception e) {
// TODO: handle exception
}
}
*/
count--;
System.out.println("消费者:" + Thread.currentThread().getName() + "完成消费"+i+",当前count=" + count );
lock.notifyAll();
}
}
} }

运行主程序:

 public static void main(String[] args) {
// TODO Auto-generated method stub
ConsumerAndProducer test = new ConsumerAndProducer();
new Thread(test.new Producer(),"生产者1").start();
new Thread(test.new Producer(),"生产者2").start();
new Thread(test.new Producer(),"生产者3").start();
new Thread(test.new Consumer(),"消费者1").start();
new Thread(test.new Consumer(),"消费者2").start();
new Thread(test.new Consumer(),"消费者3").start();
}

输出:

生产者:生产者1完成生产:1,当前count=1
生产者:生产者2完成生产:1,当前count=2
生产者:生产者3完成生产:1,当前count=3
消费者:消费者3完成消费1,当前count=2
消费者:消费者2完成消费1,当前count=1
消费者:消费者1完成消费1,当前count=0
生产者:生产者1完成生产:2,当前count=1
生产者:生产者2完成生产:2,当前count=2
生产者:生产者3完成生产:2,当前count=3
消费者:消费者3完成消费2,当前count=2
消费者:消费者1完成消费2,当前count=1
消费者:消费者2完成消费2,当前count=0
生产者:生产者1完成生产:3,当前count=1
生产者:生产者3完成生产:3,当前count=2
生产者:生产者2完成生产:3,当前count=3
消费者:消费者2完成消费3,当前count=2
消费者:消费者1完成消费3,当前count=1
消费者:消费者3完成消费3,当前count=0
生产者:生产者1完成生产:4,当前count=1
生产者:生产者2完成生产:4,当前count=2
生产者:生产者3完成生产:4,当前count=3
消费者:消费者1完成消费4,当前count=2
消费者:消费者3完成消费4,当前count=1
消费者:消费者2完成消费4,当前count=0
生产者:生产者1完成生产:5,当前count=1
生产者:生产者2完成生产:5,当前count=2
生产者:生产者3完成生产:5,当前count=3
消费者:消费者3完成消费5,当前count=2
消费者:消费者1完成消费5,当前count=1
消费者:消费者2完成消费5,当前count=0
生产者:生产者1完成生产:6,当前count=1
生产者:生产者3完成生产:6,当前count=2
生产者:生产者2完成生产:6,当前count=3
消费者:消费者3完成消费6,当前count=2
消费者:消费者2完成消费6,当前count=1
消费者:消费者1完成消费6,当前count=0
生产者:生产者1完成生产:7,当前count=1
生产者:生产者2完成生产:7,当前count=2
生产者:生产者3完成生产:7,当前count=3
消费者:消费者3完成消费7,当前count=2
消费者:消费者2完成消费7,当前count=1
消费者:消费者1完成消费7,当前count=0
生产者:生产者1完成生产:8,当前count=1
生产者:生产者2完成生产:8,当前count=2
生产者:生产者3完成生产:8,当前count=3
消费者:消费者3完成消费8,当前count=2
消费者:消费者2完成消费8,当前count=1
消费者:消费者1完成消费8,当前count=0
生产者:生产者1完成生产:9,当前count=1
生产者:生产者3完成生产:9,当前count=2
生产者:生产者2完成生产:9,当前count=3
消费者:消费者3完成消费9,当前count=2
消费者:消费者1完成消费9,当前count=1
消费者:消费者2完成消费9,当前count=0
生产者:生产者1完成生产:10,当前count=1
生产者:生产者3完成生产:10,当前count=2
生产者:生产者2完成生产:10,当前count=3
消费者:消费者3完成消费10,当前count=2
消费者:消费者2完成消费10,当前count=1
消费者:消费者1完成消费10,当前count=0

最新文章

  1. 查找素数Eratosthenes筛法的mpi程序
  2. HTML 学习笔记 CSS样式(定位)
  3. 关于win7和xp的屏设置类
  4. C语言标量类型(转)
  5. 网页撤销后ubuntu本地撤销
  6. 打开eclipse报错:发现了以元素 &#39;d:skin&#39; 开头的无效内容。此处不应含有子元素。
  7. [codevs1557]热浪
  8. Python 学习笔记(1) - 开始
  9. ASP.NET状态服务及session丢失问题解决方案总结
  10. angular中路由的实现(针对新手)
  11. php笔记一
  12. TP5整合 WorkerMan 以及 GatewayWorker
  13. Mave手动安装jar包
  14. (译)(function (window, document, undefined) {})(window, document); 真正的意思
  15. python练习册0005
  16. imp高版本的dmp文件报错问题
  17. tableview预加载
  18. spring中@Scope控制作用域
  19. 接口开发-集成接口文档(swagger)
  20. Direct2D教程III——几何(Geometry)对象

热门文章

  1. unittest如何在循环遍历一条用例时生成多个测试结果
  2. 让Spring不再难懂-mvc篇
  3. EXAM-2018-7-24
  4. form提供的两种数据传输方式 get和post method=”post“和method=”get”
  5. [LC] 121. Best Time to Buy and Sell Stock
  6. OpenCV 级联分类器
  7. deeplearning.ai 卷积神经网络 Week 3 目标检测
  8. GBDT的理解和总结
  9. 三步教你实现MyEclipse的debug远程调试
  10. CF-1066B-Heaters