多生产者 多消费者
实现连续生产多个和连续消费多个。
1 import java.util.concurrent.locks.*; 2 //描述产品 3 class Clothes 4 { 5 //产品名称 6 private String name; 7 //产品价格 8 private double price; 9 //存放产品的容器 10 private Clothes[] arr = new Clothes[100]; 11 //创建一把锁 12 private Lock lock = new ReentrantLock(); 13 //创建和锁绑定的Condition对象,控制生产线程 14 private Condition pro = lock.newCondition(); 15 //创建和锁绑定的Condition对象,控制生产线程 16 private Condition con = lock.newCondition(); 17 //生产使用的下标 18 private int propointer; 19 //消费使用的下标 20 private int conpointer; 21 //记录产品数量 22 private int count; 23 24 public Clothes(){} 25 public Clothes(String name,double price) 26 { 27 this.name = name; 28 this.price = price; 29 } 30 31 public String toString() 32 { 33 return name+",RMB:"+price; 34 } 35 36 //生产功能 37 public void produce() 38 { 39 lock.lock(); 40 try 41 { 42 //先判断该不该生产,当容器满的时候不能生产 43 while(count==arr.length) 44 { 45 try 46 { 47 pro.await(); 48 } 49 catch (InterruptedException e) 50 { 51 e.printStackTrace(); 52 } 53 } 54 arr[propointer] = new Clothes("衬衣",99.99); 55 System.out.println(Thread.currentThread().getName()+"...生产了..."+arr[propointer]+"..."+count); 56 count++; 57 if(++propointer==arr.length) 58 propointer = 0; 59 con.signal(); 60 } 61 finally 62 { 63 lock.unlock(); 64 } 65 } 66 //消费功能 67 public void consume() 68 { 69 lock.lock(); 70 try 71 { 72 //判断该不该消费,当商品数量为0的时候不能消费 73 while(count==0) 74 { 75 try 76 { 77 con.await(); 78 } 79 catch (InterruptedException e) 80 { 81 e.printStackTrace(); 82 } 83 } 84 Clothes yifu = arr[conpointer]; 85 System.out.println(Thread.currentThread().getName()+"---消费了---"+yifu); 86 count--; 87 if(++conpointer==arr.length) 88 conpointer = 0; 89 pro.signal(); 90 } 91 finally 92 { 93 lock.unlock(); 94 } 95 } 96 } 97 98 //生产任务 99 class Producer implements Runnable 100 { 101 private Clothes clo; 102 public Producer(Clothes clo) 103 { 104 this.clo = clo; 105 } 106 public void run() 107 { 108 while(true) 109 clo.produce(); 110 } 111 } 112 113 //消费任务 114 class Consumer implements Runnable 115 { 116 private Clothes clo; 117 public Consumer(Clothes clo) 118 { 119 this.clo = clo; 120 } 121 public void run() 122 { 123 while(true) 124 clo.consume(); 125 } 126 } 127 128 129 class Demo 130 { 131 public static void main(String[] args) 132 { 133 Clothes clo = new Clothes(); 134 Producer producer = new Producer(clo); 135 Consumer consumer = new Consumer(clo); 136 137 Thread t1 = new Thread(producer); 138 Thread t2 = new Thread(producer); 139 140 Thread t3 = new Thread(consumer); 141 Thread t4 = new Thread(consumer); 142 143 t1.start(); 144 t2.start(); 145 t3.start(); 146 t4.start(); 147 } 148 }

浙公网安备 33010602011771号