资源描述
多线程中的生产者和消费者
一、文件结构
二、各个类的作用、和源代码。
Bread.java自定义一个面包类
packagecom.shuiniuer.producerconsumer;
public class Bread {
int id;
public Bread(int i){
this.id=i;
}
@Override
public String toString(){
return "Bread [id=" + id + "]";
}
}
Basket.java定义一个篮子类,用于存放面包(Bread对象)
packagecom.shuiniuer.producerconsumer;
public class Basket{
int index=0;
Bread[] breadBasket=new Bread[12];//定义一个数组存放面包
public synchronized void push(Bread bread){
while(this.index==breadBasket.length){//思考为什么不用if
try {
this.wait();
} catch(InterruptedException e) {
e.printStackTrace();
}
}
this.notifyAll();//唤醒等待的线程
breadBasket[this.index]=bread;
this.index++;
}
public synchronized Breadpop(){
try {
Thread.sleep(1000);
} catch (InterruptedExceptione) {
e.printStackTrace();
}
while(this.index==0){ //思考为什么不用if
try {
this.wait();
} catch(InterruptedException e) {
e.printStackTrace();
}
}
this.notifyAll();//唤醒等待的线程
this.index--;
return breadBasket[this.index];
}
}
Producer.java生产者
packagecom.shuiniuer.producerconsumer;
public class Producer implements Runnable{
Basket breadBasket=null;
public Producer(Basketbasket){
this.breadBasket=basket;
}
@Override
public void run() {
for(int i=0;i<20;i++){
Bread bread=new Bread(i);
this.breadBasket.push(bread);
System.out.println("生产者:"+Thread.currentThread().getName()+"生产"+bread);
}
}
}
Consumer.java消费者
packagecom.shuiniuer.producerconsumer;
public class Consumer implements Runnable{
Basket breadBasket=null;
public Consumer(Basketbasket){
this.breadBasket=basket;
}
@Override
public void run() {
for(int i=0;i<20;i++){
Breadbread=this.breadBasket.pop();
System.out.println("消费者:"+Thread.currentThread().getName()+"消费"+bread);
}
}
}
Test.java测试类
packagecom.shuiniuer.producerconsumer;
public class Test {
public static void main(String[]args){
Basketbasket=new Basket();
Consumerconsumer1=new Consumer(basket);
Consumerconsumer2=new Consumer(basket);
Producerproducer1=new Producer(basket);
Producerproducer2=new Producer(basket);
Thread t3=new Thread(producer1);
Thread t4=new Thread(producer2);
Thread t1=new Thread(consumer1);
Thread t2=new Thread(consumer2);
t1.start();
t2.start();
t3.start();
t4.start();
}
}
展开阅读全文