java 多线程-生产者消费者模式-管程法
生产者消费者模式管程法
通过容器中介,将数据放入和取出
wait()导致当前线程等待,直到另一个线程调用该对象的notify()或notyfyAll()方法
notify()唤醒正在等待对象监视器的单个线程,notifyAll()唤醒正在等待对象监视器的所有线程
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;}}
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。