1 package lockTest; 2 3 import java.util.LinkedHashMap; 4 import java.util.LinkedList; 5 import java.util.concurrent.locks.Condition; 6 import java.util.concurrent.locks.Lock; 7 import java.util.concurrent.locks.ReentrantLock; 8 9 public class ConditionTest { 10 11 private Lock lock; 12 13 private LinkedList<String> buffer; 14 15 private int maxSize; 16 17 private Condition notfullCondition; 18 19 private Condition fullCondition; 20 21 public ConditionTest(int maxSize) { 22 this.maxSize = maxSize; 23 lock = new ReentrantLock(); 24 buffer = new LinkedList<>(); 25 this.maxSize = maxSize; 26 notfullCondition = lock.newCondition(); 27 fullCondition = lock.newCondition(); 28 } 29 30 public void produce(String goods) throws InterruptedException { 31 32 lock.lock(); 33 34 try { 35 36 while (maxSize == buffer.size()) { 37 notfullCondition.await(); 38 System.out.println("工厂产能达到极限,不能继续进行生产了,停工一段时间"); 39 } 40 41 //队列没有满,可以生产 42 buffer.add(goods); 43 44 System.out.println("哈哈,我生产了" + goods + ",通知消费者进行消费..."); 45 //通知消费者线程进行消费 46 fullCondition.signalAll(); 47 48 } finally { 49 lock.unlock(); 50 } 51 } 52 53 public String consume() throws InterruptedException { 54 55 String goods = null; 56 lock.lock(); 57 58 try { 59 60 while (buffer.size() == 0) { 61 System.out.println("工厂的产品已经消费完了,暂时不能剁手了"); 62 fullCondition.await(); 63 } 64 65 //开始消费 66 goods = buffer.poll(); 67 System.out.println("哈哈,我消费" + goods + ",通知工厂进行生产..."); 68 //通知生成者 69 notfullCondition.signalAll(); 70 71 } finally { 72 lock.unlock(); 73 } 74 75 return goods; 76 } 77 78 79 public static void main(String[] args) { 80 81 ConditionTest conditionTest = new ConditionTest(100); 82 83 new Thread(() -> { 84 85 for (int i = 0; i < 1000000; i++) { 86 try { 87 conditionTest.produce("笔记本电脑" + i); 88 } catch (InterruptedException e) { 89 e.printStackTrace(); 90 } 91 } 92 93 }, "produce").start(); 94 95 96 new Thread(() -> { 97 98 while (true) { 99 try { 100 conditionTest.consume(); 101 } catch (InterruptedException e) { 102 e.printStackTrace(); 103 } 104 } 105 106 }, "consume").start(); 107 108 } 109 110 }