Condition與Lock是綁定的仑扑,一個lock可以創(chuàng)建多個Condition桶略,一個Condition可以管理多個線程麻敌,Condition喚醒線程是按順序喚醒,而Synchronized wait是隨機(jī)喚醒線程帘不,看誰先搶到cpu資源誰被喚醒说莫。
Condition聲明:
Lock lock = new ReentrantLock();
Condition condition = lock.newCondition();
例:兩個線程 子線程和主線程 子線程打印一邊,主線程打印兩邊 交替打印 循環(huán)5次
聲明打印方法Demo2:
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class Demo2 {
volatile boolean flag = false;
Lock lock = new ReentrantLock();
Condition condition = lock.newCondition();
//子線程輸出
public void sub() {
try {
lock.lock();
while (flag){
condition.await();
}
for(int i=0;i<1;i++){
System.out.println("我是子線程");
}
flag= true;
condition.signal();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
public synchronized void main() {
try {
lock.lock();
while (!flag){
condition.await();
}
for(int i=0;i<2;i++){
System.out.println("我是主線程");
}
flag= false;
condition.signal();
}catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
}
main 函數(shù)類:
/**
* 兩個線程 子線程和主線程 子線程打印一邊寞焙,主線程打印兩邊 交替打印
*/
public class Demo3 {
public static void main(String[] args) throws InterruptedException {
Demo2 d = new Demo2();
new Thread(()->{
for(int i =0;i<5;i++){
d.sub();
}
}).start();
for(int i =0;i<5;i++){
d.main();
}
}
}
運(yùn)行結(jié)果:
Disconnected from the target VM, address: '127.0.0.1:60943', transport: 'socket'
我是子線程
我是主線程
我是主線程
我是子線程
我是主線程
我是主線程
我是子線程
我是主線程
我是主線程
我是子線程
我是主線程
我是主線程
我是子線程
我是主線程
我是主線程
Process finished with exit code 0