public class ProdConsumer_BlockQueueDemo {
private volatile int num;
Lock lock = new ReentrantLock();
Condition condition = lock.newCondition();
public void increment(){
lock.lock();
try{
while (num != 0){
condition.await();
}
num++;
System.out.println(Thread.currentThread().getName()+" "+num);
condition.signalAll();
}catch (Exception ignored){
}finally {
lock.unlock();
}
}
public void decrement(){
lock.lock();
try{
while (num == 0){
condition.await();
}
num--;
System.out.println(Thread.currentThread().getName()+" "+num);
condition.signalAll();
}catch (Exception ignored){
}finally {
lock.unlock();
}
}
public static void main(String[] args) {
ProdConsumer_BlockQueueDemo prodConsumer_blockQueueDemo = new ProdConsumer_BlockQueueDemo();
new Thread(()->{
for (int i = 0; i < 5; i++) {
prodConsumer_blockQueueDemo.increment();
}
},"AAA").start();
new Thread(()->{
for (int i = 0; i < 5; i++) {
prodConsumer_blockQueueDemo.decrement();
}
},"BBB").start();
new Thread(()->{
for (int i = 0; i < 5; i++) {
prodConsumer_blockQueueDemo.increment();
}
},"CCC").start();
new Thread(()->{
for (int i = 0; i < 5; i++) {
prodConsumer_blockQueueDemo.decrement();
}
},"DDD").start();
}
}