当前位置: 代码迷 >> 综合 >> 9. Condition
  详细解决方案

9. Condition

热度:80   发布时间:2024-01-29 00:08:40.0

【【【【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();}}}