【【【【ConditionTest1】】】】
package condition;import lombok.SneakyThrows;import java.util.LinkedList; import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock;public class ConditionTest1 {private static final Lock lock = new ReentrantLock();private static final Condition productCon = lock.newCondition();private static final Condition consumeCon = lock.newCondition();private static LinkedList<Long> list = new LinkedList<>();private static final int MAX = 100;public static void main(String[] args) {for (int i = 0; i < 8; i++) {startProduct(i);}for (int i = 0; i < 10; i++) {startConsume(i);}}private static void startProduct(int i) {new Thread(new Runnable() {@SneakyThrows@Overridepublic void run() {while (true) {product();TimeUnit.SECONDS.sleep(2);}}}, " - PPP - " + i).start();}private static void startConsume(int i) {new Thread(new Runnable() {@SneakyThrows@Overridepublic void run() {while (true) {TimeUnit.SECONDS.sleep(1);consume();}}}, " - CCC - " + i).start();}private static void product() {try {lock.lock();while (list.size() > MAX) {productCon.await();}long value = System.currentTimeMillis();list.addLast(value);System.out.println(Thread.currentThread().getName() + " - product - " + value);consumeCon.signalAll(); // 唤醒所有的消费者起来消费} catch (InterruptedException e) {e.printStackTrace();} finally {lock.unlock();}}private static void consume() {try {lock.lock();while (list.isEmpty()) {consumeCon.await();}long value = list.removeFirst();System.out.println(Thread.currentThread().getName() + " - consume - " + value);productCon.signalAll(); // 唤醒所有的生产者起来进行生产} catch (InterruptedException e) {e.printStackTrace();} finally {lock.unlock();}}}