1 import java.util.concurrent.locks.Condition; 2 import java.util.concurrent.locks.Lock; 3 import java.util.concurrent.locks.ReentrantLock; 4 /* 5 * 多生产者 多消费者 6 */ 7 public class producer_consumer { 8 public static void main(String[] args) { 9 Product p = new Product(); 10 Thread t0 = new Thread(new Producer(p)); 11 Thread t1 = new Thread(new Producer(p)); 12 Thread t2 = new Thread(new Consumer(p)); 13 Thread t3 = new Thread(new Consumer(p)); 14 t0.start(); 15 t1.start(); 16 t2.start(); 17 t3.start(); 18 } 19 } 20 21 class Consumer implements Runnable { 22 private Product p; 23 24 public Consumer(Product p) { 25 super(); 26 this.p = p; 27 } 28 29 @Override 30 public void run() { 31 p.get(); 32 } 33 } 34 35 class Producer implements Runnable { 36 private Product p; 37 38 public Producer(Product p) { 39 super(); 40 this.p = p; 41 } 42 43 @Override 44 public void run() { 45 p.set(); 46 } 47 48 } 49 50 class Product { 51 private String name; 52 private String color; 53 boolean flag = false; 54 55 public Product() { 56 super(); 57 } 58 59 private int pos; 60 Lock l = new ReentrantLock();//创建一个锁对象 61 Condition producer_c = l.newCondition();//创建一个生产者监视器 62 Condition consumer_c = l.newCondition();//消费者监视器 63 64 public void set() { 65 66 while (true) { 67 l.lock();//加上锁 68 while (flag) { 69 try { 70 producer_c.await(); 71 } catch (InterruptedException e) { 72 e.printStackTrace(); 73 } 74 } 75 if (pos % 2 == 0) { 76 this.setName("馒头"); 77 this.setColor("白色"); 78 } else { 79 this.setName("玉米"); 80 this.setColor("黄色"); 81 } 82 System.out.println(Thread.currentThread().getName()+"生产者生产============"+this.getName()+" *** "+this.getColor()); 83 pos++; 84 flag = true; 85 consumer_c.signal();//唤醒消费者 86 l.unlock();//释放锁 87 } 88 } 89 90 public void get() { 91 while (true) { 92 l.lock(); 93 while (!flag) { 94 try { 95 consumer_c.await(); 96 } catch (InterruptedException e) { 97 e.printStackTrace(); 98 } 99 } 100 System.out.println(Thread.currentThread().getName() + "..消费者消费..." 101 + this.getName() + "===" + this.getColor()); 102 flag=false; 103 producer_c.signal();//唤醒生产者 104 l.unlock(); 105 } 106 } 107 108 public Product(String name, String color) { 109 super(); 110 this.name = name; 111 this.color = color; 112 } 113 114 public String getName() { 115 return name; 116 } 117 118 public void setName(String name) { 119 this.name = name; 120 } 121 122 public String getColor() { 123 return color; 124 } 125 126 public void setColor(String color) { 127 this.color = color; 128 } 129 130 }