主要是與Lock配合使用
類(lèi)似于wait更振、notify 和 notifyAll必須在同步代碼塊中使用捅伤,Condition對(duì)象的方法也必須要寫(xiě)在Lock.lock與Lock.unLock()代碼之間
Condition接口的方法與Object的監(jiān)視器主要方法對(duì)比
Condition | Object | 作用 |
---|---|---|
await() | wait() | 造成當(dāng)前線程在接到信號(hào)或被中斷之前一直處于等待狀態(tài)。 |
await(long time, TimeUnit unit) | wait(long timeout) | 造成當(dāng)前線程在接到信號(hào)笆怠、被中斷或到達(dá)指定等待時(shí)間之前一直處于等待狀態(tài)蔬浙。 |
signal() | notify() | 喚醒一個(gè)等待線程 |
signalAll() | notifyAll() | 喚醒所有等待線程 |
示例實(shí)現(xiàn):子線程循環(huán)10次猪落,主線循環(huán)100次,如此循環(huán)100次
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
//子線程執(zhí)行5次,主線程執(zhí)行5次,如此循環(huán)4次
public class LockConditionDemo {
public static void main(String[] args) throws InterruptedException{
final LockDemo lockDemo = new LockDemo();
Thread thread = new Thread(new Runnable(){
@Override
public void run() {
for(int i=0;i<4;i++){
try {
lockDemo.subThread(i+1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
thread.start();//子線程
for(int i=0;i<4;i++){//主線程
lockDemo.mainThread(i+1);
}
}
}
class LockDemo{
Lock lock = new ReentrantLock();
Condition condition = lock.newCondition();
Boolean flag = false;
//子線程先執(zhí)行
public void subThread(int num) throws InterruptedException{
lock.lock();
if(flag){//true的時(shí)候子線程鎖住敛滋,默認(rèn)為false许布,故子線程先執(zhí)行
condition.await();
}
for(int i=0;i<5;i++){
System.out.println("子線程執(zhí)行第"+num+"次執(zhí)行"+(i+1));
}
flag = true;
condition.signal();
lock.unlock();
}
//主線程
public void mainThread(int num) throws InterruptedException{
lock.lock();
if(!flag){
condition.await();
}
for(int i=0;i<5;i++){
System.out.println("主線程執(zhí)行第"+num+"次執(zhí)行"+(i+1));
}
flag = false;
condition.signal();
lock.unlock();
}
}