生产者消费者
生产面包、消费面包
运用了线程锁来锁定容器,保证生产和消费过程中不冲突。
使用wait和notify来提示其他线程
生产速度=消费速度*2,所以在生产结束后,生产线程停止,消费剩余面包后,通知不到生产线程,程序不停止()
1 package ProducerConsumer; 2 3 import java.lang.Thread.State; 4 import java.util.Random; 5 6 public class App { 7 8 public static void main(String[] args) { 9 // TODO Auto-generated method stub 10 SyncStack stack=new SyncStack(); 11 Proc proc=new Proc(stack); 12 Cons cons=new Cons(stack); 13 new Thread(proc).start(); 14 new Thread(cons).start(); 15 } 16 17 } 18 19 class Bread{ 20 int id; 21 22 public Bread(int id) { 23 super(); 24 this.id = id; 25 } 26 27 @Override 28 public String toString() { 29 return "面包"+id; 30 } 31 } 32 33 34 //容器 35 class SyncStack{ 36 int index=0; 37 Bread[]breads = new Bread[20]; 38 39 //生产 40 public synchronized void put(Bread bread){ 41 while(index==breads.length){ 42 System.out.println("装满了,等待消费。。。"); 43 try { 44 this.wait(); 45 } catch (InterruptedException e) { 46 // TODO Auto-generated catch block 47 e.printStackTrace(); 48 } 49 } 50 this.notify(); 51 this.breads[index]=bread; 52 index++; 53 } 54 55 //消费 56 public synchronized Bread get(){ 57 while(index==0){ 58 System.out.println("空了,等待生产。。。"); 59 try { 60 this.wait(); 61 } catch (InterruptedException e) { 62 // TODO Auto-generated catch block 63 e.printStackTrace(); 64 } 65 } 66 this.notify(); 67 index--; 68 return breads[index]; 69 } 70 } 71 72 73 class Proc implements Runnable{ 74 75 SyncStack stack=null; 76 77 public Proc(SyncStack stack) { 78 // TODO Auto-generated constructor stub 79 this.stack=stack; 80 } 81 82 @Override 83 public void run() { 84 // TODO Auto-generated method stub 85 for(int i=0;i<100;i++){ 86 Bread bread=new Bread(i); 87 stack.put(bread); 88 System.out.println("生成了:"+bread); 89 try { 90 Thread.sleep(new Random().nextInt(5)*1000); 91 } catch (InterruptedException e) { 92 // TODO Auto-generated catch block 93 e.printStackTrace(); 94 } 95 } 96 } 97 } 98 99 100 class Cons implements Runnable{ 101 SyncStack stack; 102 103 public Cons(SyncStack stack) { 104 this.stack = stack; 105 } 106 107 @Override 108 public void run() { 109 // TODO Auto-generated method stub 110 while(true){ 111 Bread bread=stack.get(); 112 System.out.println("消费了:"+bread); 113 try { 114 Thread.sleep(new Random().nextInt(5)*2000); 115 } catch (InterruptedException e) { 116 // TODO Auto-generated catch block 117 e.printStackTrace(); 118 } 119 } 120 } 121 }