一、线程通信Condition
基于Lock锁的线程通信,可以通过Condition对象实现。Condition对象可以通过lock.newCondition()生成。
线程通信方法await、signal和signalAll,是和sychronized的通信方法wait,notify和notifyAll一一对应。
二、实现代码实例
参考:https://blog.csdn.net/u010886217/article/details/104941864
1.注意修改代码Clerk类
package com.Java.BaseUse.juc.ProAndCon_SychronizedImp_multi_condition;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
* 店员
* 修改使用lock显示锁,并使用condition通信
*/
class Clerk{
private int product=0;
private Lock lock=new ReentrantLock();
//lock的线程通信
Condition condition=lock.newCondition();
//进货
public void get(){
lock.lock();
try {
while(product>=1){
System.out.println("产品已满!");
try {
// this.wait();
condition.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// else{
// System.out.println(Thread.currentThread().getName()+":"+ ++product);
// this.notifyAll();
// }
System.out.println(Thread.currentThread().getName()+":"+ ++product);
// this.notifyAll();
condition.signalAll();
}finally {
lock.unlock();
}
}
//卖货
public void sale(){
lock.lock();
try {
while (product<=0){
System.out.println("产品已没有了!");
try {
// this.wait();
condition.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// else {
// System.out.println(Thread.currentThread().getName()+":"+ --product);
// this.notifyAll();
// }
System.out.println(Thread.currentThread().getName()+":"+ --product);
// this.notifyAll();
condition.signalAll();
}finally {
lock.unlock();
}
}
}
2.测试类运行结果
产品已没有了!
产品已没有了!
生产者A:1
消费者B:0
产品已没有了!
产品已没有了!
生产者C:1
消费者B:0
产品已没有了!
产品已没有了!
生产者A:1
消费者B:0
产品已没有了!
产品已没有了!
生产者C:1
消费者B:0
产品已没有了!
产品已没有了!
生产者A:1
消费者B:0
产品已没有了!
产品已没有了!
生产者C:1
消费者B:0
产品已没有了!
产品已没有了!
生产者A:1
消费者B:0
产品已没有了!
产品已没有了!
生产者C:1
消费者B:0
产品已没有了!
产品已没有了!
生产者A:1
消费者B:0
产品已没有了!
产品已没有了!
生产者C:1
消费者B:0
产品已没有了!
产品已没有了!
生产者A:1
消费者B:0
产品已没有了!
产品已没有了!
生产者C:1
消费者B:0
产品已没有了!
产品已没有了!
生产者A:1
消费者B:0
产品已没有了!
产品已没有了!
生产者C:1
消费者B:0
产品已没有了!
产品已没有了!
生产者A:1
消费者B:0
产品已没有了!
产品已没有了!
生产者C:1
消费者B:0
产品已没有了!
产品已没有了!
生产者A:1
消费者B:0
产品已没有了!
产品已没有了!
生产者C:1
消费者B:0
产品已没有了!
产品已没有了!
生产者A:1
消费者B:0
产品已没有了!
产品已没有了!
生产者C:1
消费者B:0
产品已没有了!
产品已没有了!
生产者A:1
消费者B:0
产品已没有了!
生产者C:1
消费者D:0
产品已没有了!
生产者A:1
消费者D:0
产品已没有了!
生产者C:1
消费者D:0
产品已没有了!
生产者A:1
消费者D:0
产品已没有了!
生产者C:1
消费者D:0
产品已没有了!
生产者A:1
消费者D:0
产品已没有了!
生产者C:1
消费者D:0
产品已没有了!
生产者A:1
消费者D:0
产品已没有了!
生产者C:1
消费者D:0
产品已没有了!
生产者A:1
消费者D:0
产品已没有了!
生产者C:1
消费者D:0
产品已没有了!
生产者A:1
消费者D:0
产品已没有了!
生产者C:1
消费者D:0
产品已没有了!
生产者A:1
消费者D:0
产品已没有了!
生产者C:1
消费者D:0
产品已没有了!
生产者A:1
消费者D:0
产品已没有了!
生产者C:1
消费者D:0
产品已没有了!
生产者A:1
消费者D:0
产品已没有了!
生产者C:1
消费者D:0
产品已没有了!
生产者A:1
消费者D:0
产品已没有了!
生产者C:1
消费者D:0