Condition

主要是与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();
    }   
}

你可能感兴趣的:(Condition)