直接看代码:
package beijing.lele; public class ProduceConsumeThread { /** * 对于线程死锁,用生产消费者模式|方案来解决, 生活中,人车 共用车道资源也是生产者消费者现象 * 生产者消费者模式有两种解决方式: * 1 用容器,容器满了 就停止 2 信号灯法,标识位 (这种方式下,必须要 this.wait() + this.notify() + synchronized 才生效) */ /** 这是没修改前跑出来的结果: 电影院1 生产了: 天空电影 李四消费了: 天空电影 电影院1 生产了: 草地电影 张三消费了: 草地电影 李四消费了: 草地电影 张三消费了: 草地电影 电影院1 生产了: 天空电影 张三消费了: 天空电影 修改成功后的结果: 电影院1 生产了: 天空电影 李四消费了: 天空电影 电影院1 生产了: 草地电影 张三消费了: 草地电影 电影院1 生产了: 天空电影 张三消费了: 天空电影 * @param args */ public static void main(String[] args) { Moive moive = new Moive(); // 多线程必须是对同一个对象moive的引用才能会在 moive方法中的 this.wait() this.notify()生效 OK了 //MyMoive1 moive = new MyMoive1(); 原版OK的 //Moive0 moive = new Moive0(); OK了 new Thread(new Producer(moive),"电影院1").start();// 类Producer和Consumer共同持有moive这个公共对象类,但是分别调用这个moive类的生产和消费方法。 new Thread(new Consumer(moive),"张三").start();// 而在公共持有类moive的生产和消费这两个方法中,使用信号灯来控制对方的等待和执行 new Thread(new Consumer(moive),"李四").start(); } } //业务类 class MyMoive1 { String msg; private boolean flag = false; // 生产 synchronized void play(String msg) { while (flag) { try { wait(); } catch (InterruptedException e) { System.out.println("InterruptedException caught"); } } try { Thread.sleep(250) ;// 生产耗时 } catch (InterruptedException e) { e.printStackTrace(); } this.msg = msg; System.out.println(Thread.currentThread().getName() + "--生产电影: " + msg); flag = true; notifyAll(); } // 消费 synchronized void watch() { while (!flag) { try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } try { Thread.sleep(250) ;// 消费耗时 } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + "--消费: " + msg); flag = false; notifyAll(); } } //业务类 class Moive0{ private String msg ; // flag=true时, 生产者生产,消费者等待,生产完毕后通知消费者 // flag=false时,生产者等待,消费者消费,消费完毕后通知生产者 private boolean flag = true; // 生产 public synchronized void play(String msg) { while(!flag) {// flag= false时 等待消费 try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } // 开始生产 flag = true时开始生产 try { Thread.sleep(300);// 模拟生产数据的耗时 } catch (InterruptedException e) { e.printStackTrace(); } this.msg = msg; System.out.println(Thread.currentThread().getName() +" 生产了: " + msg); // 通知消费 flag = false; notifyAll(); } // 消费 public synchronized void watch() { while(flag) {// flag=true时,开始生产,此时消费方法进行等待 try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } // 开始消费 try { Thread.sleep(300);// 模拟消费数据的耗时 } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() +"消费了: " + msg); // 通知消费 flag = true; notifyAll(); } } //业务类 class Moive{ private String msg ; // flag=true时, 生产者生产,消费者等待,生产完毕后通知消费者 // flag=false时,生产者等待,消费者消费,消费完毕后通知生产者 private boolean flag = true; // 生产 public synchronized void play(String msg) { while(!flag) {// 等待消费 try { this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } // 开始生产 try { Thread.sleep(300);// 模拟生产数据的耗时 } catch (InterruptedException e) { e.printStackTrace(); } this.msg = msg; System.out.println(Thread.currentThread().getName() +" 生产了: " + msg); // 通知消费 this.flag = false; this.notifyAll(); } // 消费 public synchronized void watch() { while(flag) {// 等待生产 try { this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } // 开始消费 try { Thread.sleep(300);// 模拟消费数据的耗时 } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() +"消费了: " + msg); // 通知消费 this.flag = true; this.notifyAll(); } } // 生产者 class Producer implements Runnable{ //private MyMoive1 moive; private Moive moive; //private Moive0 moive; public Producer() { } //public Producer(MyMoive1 moive) { public Producer(Moive moive) { //public Producer(Moive0 moive) { this.moive = moive; } @Override public void run() { for(int i=0; i<50; i++) { if(i%2 == 0) { moive.play("天空电影"); }else{ moive.play("草地电影"); } } } } // 消费者 class Consumer implements Runnable{ //private MyMoive1 moive; // 公共持有类, 此类上持有业务方法 private Moive moive; //private Moive0 moive; public Consumer() { } //public Consumer(MyMoive1 moive) { public Consumer(Moive moive) { //public Consumer(Moive0 moive) { this.moive = moive; } @Override public void run() { for(int i=0; i<50; i++) { moive.watch(); } } }
和单生产者单消费者代码的区别在:
Movie业务类的 生产和消费方法中:
前者是用:
if(!flag) { 后者用 while(!flag) {
相关推荐
使用多线程实现了生产者和消费者模式
java多线程实现生产者和消费者
主线程、生产者线程(一)、消费者管理线程(一)、消费者线程(多),以及一些全局变量。 主线程职责:UI控件的控制和显示、控制生产者:调节生产的速度和暂停与继续、控制消费 生产者线程职责:根据商品数量调控...
用java多线程简易实现生产者消费者模式的代码,用java多线程简易实现生产者消费者模式的代码。
基于Qt信号量实现的单生产者多消费者模式下的消息队列,可在多线程应用中对不同的消息结构体进行数据传输。
a: 创建一个线程 ...h: problem1 生产者消费者问题 (1生产者 1消费者 1缓冲区) problem1 more 生产者消费者问题 (1生产者 2消费者 4缓冲区) problem2 读者与写着问题 I: 信号量 semaphore 解决线程同步问题
编写一个“生产者-消费者”的多线程演示程序,两个生产者,一个消费者,可以存放产品的仓库容量为10,仓库用栈实现,并有同步功能,且能防止先消费后生产的情况。
使用多线程程序模拟实现单生产者/多消费者问题。 要求“生产者”随机产生一个整数,“消费者 1”将这个整数加 1 后输出,“消 费者 2”将这个整数加 2 后输出,“消费者 3”将这个整数加 3 后输出,“消 费者 4”将...
Linux 多线程实现生产者消费者模式.pdf
java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型...
Qt5多线程,使用QSemaphore类实现生产者和消费者问题。
c#多线程之生产者消费者
以生产者/消费者问题为例来阐述Linux线程的控制和通信。一组生产者线程与一组消费者线程通过缓冲区发生联系。生产者线程将生产的产品送入缓冲区,消费者线程则从中取出产品。缓冲区有N 个,是一个环形的缓冲池。 ...
多线程生产者与消费者,,生产者和消费者的解答网络上有多种线程版本,但却没看到进程版本,所以我就来填补这一“空白”了。PS:使用进程版本的另一个重要原因是,想顺便复习下共享内存。 我们使用信号量来同步,用...
delphi多线程生产者消费者模式源程序
java 多线程 生产者消费者模式,你值得拥有
本文通过多线程方法解决了生产者与消费者之间同步的问题
生产者消费者流程图; 生产者消费者流程图。
java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现...
java 多线程 生产者消费者模式,多个生产者对多个消费者,使用jdk 线程池及 BlockingQueue实现,解决了待生产的任务生产完成后,正常终止所有线程,避免线程(特别是消费者线程)因阻塞而无限等待的情况。源码中还简单...