【经典问题】生产者消费者
来源:互联网 发布:windows主题包 编辑:程序博客网 时间:2024/06/15 06:03
生产者消费者问题是线程同步的经典问题,其中的逻辑和细节是很多初学者犯错的地方,博主今日就此问题进行了一下回顾。
背景:生产者->厨师(蒸馒头,最多20个) 消费者->顾客(吃馒头,最多20个) 篮子里最多装6个,这里就涉及到了线程同步问题。
public class ProducerConsumer { public static void main(String[] args) { SyncStack ss = new SyncStack(); Producer p = new Producer(ss); Consumer c = new Consumer(ss); new Thread(p).start(); new Thread(c).start(); }}class ManTou{ int id; public ManTou(int id) { this.id = id; } public String toString(){ return "馒头"+id; }}class SyncStack{ int index = 0; ManTou[] arrMT = new ManTou[6]; public synchronized void push(ManTou mt){ while (index == arrMT.length) { //这里不用if的原因是下面的try语句catch到异常会继续向下执行 index会越界!!! try { this.wait(); } catch (InterruptedException ex) { // 看这里!!! ex.printStackTrace(); } } this.notifyAll(); //这里可以配合多个线程 arrMT[index] = mt; index++; System.out.println("篮子里面有"+index+"个"); } public synchronized ManTou pop(){ while (index == 0) { //同不用if 用while try { this.wait(); } catch (InterruptedException ex) { ex.printStackTrace(); } } this.notifyAll(); index--; return arrMT[index]; }}class Producer implements Runnable{ SyncStack ss = null; public Producer(SyncStack ss) { this.ss = ss; } public void run() { for (int i = 0; i < 20; i++) { ManTou mt = new ManTou(i); System.out.print("生产了" + mt+","); ss.push(mt); try { Thread.sleep((int)(Math.random()*100)); } catch (InterruptedException e) { e.printStackTrace(); } } }}class Consumer implements Runnable{ SyncStack ss = null; public Consumer(SyncStack ss) { this.ss = ss; } public void run() { for (int i = 0; i < 20; i++) { ManTou mt = ss.pop(); ///这里我曾经错了 曾经这么写的 ManTou = new Mantou(i);ss.pop(mt); 错了!!!记住!!! System.out.println("消费了" + mt+",吃了 "+(i+1)+" 个"+",还有"+ss.index+"个"); try { Thread.sleep((int)(Math.random()*100)); } catch (InterruptedException e) { e.printStackTrace(); } } }}
里面注释也写得比较详细,
ps:最开始遇到很恶心的问题,就是有时候会出现先消费的情况,明明篮子里面没有馒头,但是还是先消费了,然后我也没找到问题的所在,但是后来没管它,竟然又没有问题了。如果这个问题还在发生着并且你找到了问题的所在,请及时联系我,谢谢。
0 0
- 经典生产者消费者问题
- 【经典问题】生产者消费者
- 经典消费者生产者问题
- 经典问题-生产者和消费者
- java生产者消费者经典问题
- 经典问题-生产者和消费者问题
- 经典进程同步问题-生产者消费者问题
- 经典进程同步问题-生产者与消费者
- 经典进程问题:生产者与消费者
- 经典线程同步问题(生产者&消费者)
- 多线程八 生产者消费者经典问题
- java多线程之生产者消费者经典问题
- 经典多线程实例:生产者消费者问题
- 线程经典,生产者与消费者问题
- 多线程经典问题-生产者与消费者
- 多线程之经典生产者消费者问题
- java同步经典问题生产者消费者
- java多线程之生产者消费者经典问题
- UItableview 中嵌套WebView
- Spring RMI源码分析
- 希尔排序
- Qt学习笔记之图片显示(自动调整大小适应设计的范围)
- 基于perl面向对象开发的微信机器人
- 【经典问题】生产者消费者
- 13、Spring工具类的使用
- PTS PCR DTS 详解
- Asp.net原理理解(错误,不足继续补充)
- 伤寒杂病论白话文
- 14、Spring工具类之Resource
- Linux第三步交叉工具链arm-linux-gcc的安装
- 第11课:Spark Streaming源码解读之Driver中的ReceiverTracker架构设计以及具体实现彻底研究
- 【SHELL】监控系统信息CPU,磁盘,内存