一、線程通信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