生产者-消费者模式
- 生产者负责生产产品。
- 消费者负责取走并使用产品。
- 生产者生产完成后通知消费者可以取走产品了。
- 消费者消费完产品后需要通知生产者生产产品。
- 生产者没有生产完成,消费者不能取走产品。
- 消费者没有使用完产品,生产者不能生产产品。
1 package Main; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 import java.util.concurrent.Callable; 6 7 class Product 8 { 9 private Object lockObj = new Object(); 10 private String name; 11 private String content; 12 private boolean available = false; 13 14 public void setInfo(String name, String content) 15 { 16 synchronized(this.lockObj) 17 { 18 if(this.available == true) //可以获取 不能生产 19 { 20 try 21 { 22 this.lockObj.wait(); 23 }catch(Exception e) 24 {} 25 } 26 27 28 this.name = name; 29 try 30 { 31 Thread.sleep(200); 32 }catch(Exception ignore) 33 {} 34 35 this.content = content; 36 37 this.available = true;//生产完成 38 this.lockObj.notifyAll(); 39 } 40 } 41 42 public void showInfo() 43 { 44 StringBuffer info = new StringBuffer(); 45 synchronized(this.lockObj) 46 { 47 if(this.available == false) 48 { 49 try 50 { 51 this.lockObj.wait(); 52 }catch(Exception e) 53 {} 54 } 55 info.append("name:").append(this.name); 56 try 57 { 58 Thread.sleep(100); 59 }catch(Exception e) 60 {} 61 info.append(" content:" + this.content); 62 System.out.println(info.toString()); 63 this.available = false; 64 this.lockObj.notifyAll(); 65 } 66 } 67 } 68 69 class Producer implements Runnable 70 { 71 private Product product ; 72 public Producer(Product product) 73 { 74 this.product = product; 75 } 76 77 @Override 78 public void run() 79 { 80 for(int i = 1; i <= 100; i ++) 81 { 82 if(i % 2 ==0) 83 { 84 this.product.setInfo("笔记本", "惠普笔记本,妈妈再也不用担心冬天没暖气了"); 85 }else 86 { 87 this.product.setInfo("Galaxy Note7", "出门旅行,杀人灭口必备武器"); 88 } 89 } 90 } 91 } 92 93 class Consumer implements Runnable 94 { 95 private Product product ; 96 public Consumer(Product product) 97 { 98 this.product = product; 99 } 100 101 @Override 102 public void run() 103 { 104 for(int i =1; i <= 100; i++) 105 { 106 this.product.showInfo(); 107 } 108 } 109 } 110 111 public class Main 112 { 113 public static void main(String[] args) throws Exception 114 { 115 Product product = new Product(); 116 Producer producer = new Producer(product); 117 Consumer consumer = new Consumer(product); 118 Thread tProducer = new Thread(producer); 119 Thread tConsumer = new Thread(consumer); 120 121 tProducer.start(); 122 tConsumer.start(); 123 tProducer.join(); 124 tConsumer.join(); 125 126 System.out.println("Main Done//~~"); 127 } 128 }