Java——多生產者 多消費者
阿新 • • 發佈:2019-02-04
//使用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();
}
}