Condition

Condition接口也提供了类似的Object的监视器方法(wait),与Lock配合可以实现等待/通知模式。但是这两者在使用方式以及功能上还是有差别的。

最主要的区别我认为有两个:
1.Condition可以创建多个等待队列,而监视器只能有一个等待队列
2.Condition支持不响应中断

public class ConditionTest02 {

    public static Object obj = new Object();
    public static Lock lock = new ReentrantLock();
    public static Condition cd01 = lock.newCondition();
    public static void main(String[] args) throws InterruptedException {
        ConditionTest02 test = new ConditionTest02();
        Thread thread = new Thread(test::say01);
        Thread thread02 = new Thread(test::say02);
        Thread thread03 = new Thread(test::say03);


        thread.start();
        thread02.start();
        thread03.start();

        // 饿他们5秒钟
        Thread.sleep(5000);

        // 中断
        thread.interrupt();
        thread02.interrupt();
        // say03会中断失败
        thread03.interrupt();

    }

    /**
     * 说:小强饿了
     */
    public void say01(){
        try{
            lock.lock();
            System.out.println("小强饿了");
            System.out.println("小强等待投食");
            cd01.await();
            System.out.println("小强吃饱了");
        }catch (InterruptedException e){
            System.out.println("小强出去觅食了");
        }catch (Exception e){
            e.printStackTrace();
        } finally {
            lock.unlock();
        }
    }

    /**
     * 说:小明饿了
     */
    public void say02(){
        try{
            synchronized (obj){
                System.out.println("小明饿了");
                System.out.println("小明等待投食");
                obj.wait();
                System.out.println("小明吃饱了");
            }
        } catch (InterruptedException e){
            System.out.println("小明出去觅食了");
        }
    }

    /**
     * 说:小月鸟饿了 中断无用 
     */
    public void say03(){
        try{
            lock.lock();
            System.out.println("小月鸟饿了");
            System.out.println("小月鸟等待投食");
            cd01.awaitUninterruptibly();
            System.out.println("小月鸟吃饱了");
        }catch (Exception e){
            System.out.println("小月鸟出去觅食了");
            e.printStackTrace();
        } finally {
            lock.unlock();
        }
    }

}

输出结果:
小明饿了
小明等待投食
小强饿了
小强等待投食
小月鸟饿了
小月鸟等待投食
小明出去觅食了
小强出去觅食了
posted @ 2023-02-10 16:03  刚刚好。  阅读(28)  评论(0编辑  收藏  举报