日期:2014-05-20 浏览次数:20966 次
package javase.thread;
import java.util.ArrayList;
public class ProducerConsumer {
/**
* @date: 2011-09-03 16:24
* @desc:多线程中的经典问题-生产者消费者 如果多个线程使用同一个实现Runnable的类,那么他们共享该类的成员。
*/
public static ArrayList store = new ArrayList();// 仓库
public static void main(String[] args) {
ProducerConsumer pc=new ProducerConsumer();
ThreadTarget target0=pc.new ThreadTarget(0,store);//生产者
ThreadTarget target1=pc.new ThreadTarget(1,store);//消费者
for (int i=0;i<10;i++){
Thread p=new Thread(target0);
Thread c=new Thread(target1);
p.setName("生产者"+i);
c.setName("消费者"+i);
p.start();
c.start();
}
}
class ThreadTarget implements Runnable{
public ArrayList productsList = null;
private int flag=0;//0为生产者,1为消费者
public ThreadTarget(int flag,ArrayList st){
this.flag=flag;
this.productsList=st;
}
public void run() {
if (this.flag==0){
produce();
}
else{
consume();
}
}
public synchronized void consume() {
while(productsList.size()==0) {
try {
System.out.println("产品库为空," + Thread.currentThread().getName() + "需要等待");
Thread.currentThread().wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
productsList.remove(0);
System.out.println(Thread.currentThread().getName() + "消费了一个产品。产品库存为:" + productsList.size());
try{
this.notifyAll();//通知生产者可以进行生产了。
}
catch(IllegalMonitorStateException e){
}
}
public synchronized void produce() {
while(productsList.size() == 20) {
try {
System.out.println("产品库已满," + Thread.currentThread().getName() + "需要等待");
Thread.currentThread().wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}// 产品到20了。
productsList.add("p");//p即product的代表。
System.out.println(Thread.currentThread().getName() + "生产了一个产品。产品库存为:" +productsList.size());
this.notifyAll();//通知消费者线程可以进入队列等候jvm分配cpu时间片了。
}
}
}