import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class TestProducerAndConsumer {
private static transient int targerTeas = 100;
private static transient AtomicInteger produced = new AtomicInteger(0);
private static transient AtomicInteger exist = new AtomicInteger(0);
private static transient AtomicInteger sell = new AtomicInteger(0);
public static void main(String[] args) {
Lock lock = new ReentrantLock();
Condition producer = lock.newCondition();
Condition consumer = lock.newCondition();
Runnable producerTask = () -> {
lock.lock();
try {
while (produced.intValue() < targerTeas) {
if (exist.intValue() > 5 && produced.intValue() > 10) {
consumer.signalAll();
producer.await();
}
Thread.sleep(1000L);
produced.incrementAndGet();
exist.incrementAndGet();
System.out.println("====================生产了" + produced.intValue() + "个");
}
System.out.println("已经生产了100个 不卖了 只卖100个!!!!!!!!!!!!!!!!!!!!");
consumer.signalAll();
} catch (Exception e) {
} finally {
lock.unlock();
}
};
Runnable consumerTask = () -> {
lock.lock();
try {
while (exist.intValue() <= 0) {
if (produced.intValue() == targerTeas && exist.intValue() <= 0) {
System.out.println("沒有了 今天不卖了" + Thread.currentThread().getName() + "没有买到");
throw new RuntimeException();
}
producer.signal();
consumer.await();
}
exist.decrementAndGet();
sell.incrementAndGet();
System.out.println(Thread.currentThread().getName() + "买了茶;卖了第" + sell.intValue() + "袋茶叶");
} catch (Exception e) {
} finally {
lock.unlock();
}
};
System.out.println("开始买卖!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
new Thread(producerTask).start();
for (int i = 1; i < 121; i++) {
new Thread(consumerTask, "第" + i + "个买主").start();
}
}
}
"C:\Program Files\Java\jdk1.8.0_231\bin\java.exe" -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:51308,suspend=y,server=n -javaagent:C:\Users\14806\AppData\Local\JetBrains\IntelliJIdea2021.2\captureAgent\debugger-agent.jar -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_231\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_231\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_231\jre\lib\ext\access-bridge-6