1. 程式人生 > >Java——多生產者 多消費者

Java——多生產者 多消費者

//使用jdk1.5的多執行緒實現方式實現可以同時多生產多消費的功能
//跟之前的部落格類似,就是多了個容器,從而實現多生產多消費的功能
import java.util.concurrent.locks.*;
//描述產品
class Clothes{
    //產品名稱
    private String name;
    //產品價格
    private double price;
    //存放產品的容器
    private Clothes[] arr = new Clothes[100];
    //建立一把鎖
    private Lock lock = new ReentrantLock();
    //建立和鎖繫結的Condition物件,控制生產執行緒
private Condition pro = lock.newCondition(); //建立和鎖繫結的Condition物件,控制消費執行緒 private Condition con = lock.newCondition(); //生產使用的下標 private int propointer; //消費使用的下標 private int conpointer; //記錄產品數量 private int count; public Clothes(){} public Clothes(String name,double
price){ this.name = name; this.price = price; } //生產功能 public void produce(){ lock.lock(); try{ //先判斷該不該生產,當容器滿的時候不能生產 while(count==arr.length){ try{pro.await();}catch(InterruptedException e){e.printStackTrace();} } arr[propointer] = new
Clothes("襯衣",99.99); System.out.println(Thread.currentThread().getName()+"...生產了..."+arr[propointer]+"..."+count); count++;//數量+1 if(++propointer==arr.length) propointer = 0; con.signal(); } finally{ lock.unlock(); } } //消費功能 public void consume(){ lock.lock(); try{ //先判斷該不該消費,當商品數量為0的時候不能消費 while(count==0){ try{con.await();}catch(InterruptedException e){e.printStackTrace();} } Clothes yifu = arr[conpointer]; System.out.println(Thread.currentThread().getName()+"...消費了..."+yifu); count--; if(++conpointer==arr.length) conpointer = 0; pro.signal(); } finally{ lock.unlock(); } } public String toString(){ return name+","+price; } } //生產任務 class Producer implements Runnable{ private Clothes clo; public Producer(Clothes clo){ this.clo = clo; } public void run(){ while(true){ clo.produce(); } } } //消費任務 class Consumer implements Runnable{ private Clothes clo; public Consumer(Clothes clo){ this.clo = clo; } public void run(){ while(true){ clo.consume(); } } } class test{ public static void main(String[] args){ Clothes clo = new Clothes(); Producer producer = new Producer(clo); Consumer consumer = new Consumer(clo); Thread t1 = new Thread(producer); Thread t2 = new Thread(producer); Thread t3 = new Thread(consumer); Thread t4 = new Thread(consumer); t1.start(); t2.start(); t3.start(); t4.start(); } }