java 多线程-生产者消费者模式-管程法
发布时间:2020-12-15 08:22:33 所属栏目:Java 来源:网络整理
导读:生产者消费者模式管程法 通过容器中介,将数据放入和取出 wait()导致当前线程等待,直到另一个线程调用该对象的notify()或notyfyAll()方法 notify()唤醒正在等待对象监视器的单个线程,notifyAll()唤醒正在等待对象监视器的所有线程 public class tuble {publ
生产者消费者模式管程法
通过容器中介,将数据放入和取出 wait()导致当前线程等待,直到另一个线程调用该对象的notify()或notyfyAll()方法 public class tuble { public static void main(String[]args) { SynContainer container=new SynContainer(); new Productor(container).start(); new Productor(container).start(); new Consumer(container).start(); } } //生产者,将数据存入容器 class Productor extends Thread { SynContainer container; public Productor(SynContainer container) { this.container=container; } public void run() { for(int i=0;i<100;i++) { System.out.println("生产第"+i+"个馒头"); container.push(new Data(i)); } } } //消费者,将数据从容器取出 class Consumer extends Thread { SynContainer container; public Consumer(SynContainer container) { this.container=container; } public void run() { for(int i=0;i<100;i++) { System.out.println("消费第"+container.pop().id+"个馒头"); } } } //缓冲区 class SynContainer { Data[] datas=new Data[10]; //缓冲区里面存取数据 int count=0;//计数器 //存 public synchronized void push(Data data) { //何时能生产 if(count==datas.length) { try { this.wait();//线程阻塞,消费者通知生产才解除阻塞 } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } datas[count]=data; count++; this.notify(); //存在数据,通知消费者可消费 } //取 public synchronized Data pop() { //何时能取: if(count==0) { try { this.wait();//线程阻塞,生产者通知消费解除阻塞 } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } count--; Data data=datas[count]; this.notifyAll();//存在空间,通知生产者可生产 return data; } } //数据 class Data { int id; public Data(int id) { this.id=id; } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |