多線程之生產者和消費者模式
阿新 • • 發佈:2018-03-08
多線程多線程生產者只有多個生產者,多個消費者!這裏不講基礎的知識。
代碼如下
package Thread; class Resource { private String name; private int count=0; private boolean flag=false; public synchronized void set(String name){ while (flag){ //這裏必須用循環因為要讓每個生產者都知道自己要不要生產。如果不加就可能出現生產者喚醒生產者,然後連續兩次生產。 try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } this.name=name+"--"+count++; System.out.println(Thread.currentThread().getName()+"...生產者..."+this.name); flag=true; this.notifyAll();//這裏也要用notifyAll()否則,可能造成所有的線程都在等待。 } public synchronized void out(){ while(!flag){ try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println(Thread.currentThread().getName()+"...消費者..."+this.name); flag=false; this.notifyAll(); } } class Producer implements Runnable{ private Resource res; Producer(Resource res){ this.res=res; } public void run() { while(true){ res.set("商品"); } } } class Consumer implements Runnable{ private Resource res; Consumer(Resource res){ this.res=res; } public void run() { while(true){ res.out(); } } } public class ProducterConsumerDemo { public static void main(String[] args) { Resource r=new Resource(); Producer pro=new Producer(r); Consumer con=new Consumer(r); Thread t1=new Thread(pro); Thread t2=new Thread(pro); Thread t3=new Thread(con); Thread t4=new Thread(con); t1.start(); t2.start(); t3.start(); t4.start(); } }
這是運行的結果。可以看出都是一個生產一個消費。
多線程之生產者和消費者模式