1、多线程中的生产者和消费者 一、文件结构 二、各个类的作用、和源代码。 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定义一个篮子类,用于存放面包(Brea
2、d对象) 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(Inte
3、rruptedException e) { e.printStackTrace(); } } this.notifyAll();//唤醒等待的线程 breadBasket[this.index]=bread; this.index++; } public synchronized Breadpop(){ try { Thread.sleep(1000); } catch (InterruptedExceptione) { e.
4、printStackTrace(); } while(this.index==0){ //思考为什么不用if try { this.wait(); } catch(InterruptedException e) { e.printStackTrace(); } } this.notifyAll();//唤醒等待的线程 this.index--; return breadBasket[this.index];
5、 } } 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++){ B
6、read 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=nu
7、ll; 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); } }
8、 } 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(baske
9、t); 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(); } }






