Condition与Lock是绑定的,一个lock可以创建多个Condition,一个Condition可以管理多个线程,Condition唤醒线程是按顺序唤醒,而Synchronized wait是随机唤醒线程,看谁先抢到cpu资源谁被唤醒。
Condition声明:
Lock lock = new ReentrantLock();
Condition condition = lock.newCondition();
例:两个线程 子线程和主线程 子线程打印一边,主线程打印两边 交替打印 循环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 函数类:
/**
* 两个线程 子线程和主线程 子线程打印一边,主线程打印两边 交替打印
*/
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();
}
}
}
运行结果:
Disconnected from the target VM, address: '127.0.0.1:60943', transport: 'socket'
我是子线程
我是主线程
我是主线程
我是子线程
我是主线程
我是主线程
我是子线程
我是主线程
我是主线程
我是子线程
我是主线程
我是主线程
我是子线程
我是主线程
我是主线程
Process finished with exit code 0