主要是与Lock配合使用
类似于wait、notify 和 notifyAll必须在同步代码块中使用,Condition对象的方法也必须要写在Lock.lock与Lock.unLock()代码之间
Condition接口的方法与Object的监视器主要方法对比
Condition | Object | 作用 |
---|---|---|
await() | wait() | 造成当前线程在接到信号或被中断之前一直处于等待状态。 |
await(long time, TimeUnit unit) | wait(long timeout) | 造成当前线程在接到信号、被中断或到达指定等待时间之前一直处于等待状态。 |
signal() | notify() | 唤醒一个等待线程 |
signalAll() | notifyAll() | 唤醒所有等待线程 |
示例实现:子线程循环10次,主线循环100次,如此循环100次
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
//子线程执行5次,主线程执行5次,如此循环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;
//子线程先执行
public void subThread(int num) throws InterruptedException{
lock.lock();
if(flag){//true的时候子线程锁住,默认为false,故子线程先执行
condition.await();
}
for(int i=0;i<5;i++){
System.out.println("子线程执行第"+num+"次执行"+(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("主线程执行第"+num+"次执行"+(i+1));
}
flag = false;
condition.signal();
lock.unlock();
}
}