JUC_Condition实现精准唤醒

本文介绍了Java 1.5引入的Condition接口,作为wait()和notify()方法的安全替代,提供了更精细的线程同步控制。Condition接口的await()、signal()和signalAll()方法分别对应wait()、notify()和notifyAll()。示例代码展示了如何在Lock接口实现类中创建并使用Condition,确保线程间的正确通信和顺序执行。
摘要由CSDN通过智能技术生成

Condition概述

Condition接口出现于Java1.5版本,用于取代Object类中的wait()方法与notify()方法,Condition接口相较于后者更为安全与高效

Conditon接口的await()方法 对应 Object类的wait()方法

Condition接口的signal()方法 对应 Object的类notify()方法

Condition接口中的signalAll()方法 对应 Object的类notifyAll()方法

Condition接口的使用依赖于Lock接口,创建Condition接口实现类的实例需要通过Lock接口实现类的实例

Condition condition = lock.newCondition()

Condition接口的方法,必须在同步代码块使用,即介于lock.lock()与lock.unlock()之间,否则在运行时会抛出IllegalMonitorStateException异常

示例代码

public class Test {
    public static void main(String[] args) throws InterruptedException {
        X x = new X();
        //开启三个线程分别执行x1、x2、x3方法
        new Thread(x::x1).start();
        new Thread(x::x2).start();
        new Thread(x::x3).start();
        //确保前三个线程都被开启后 再开启第四个线程
        TimeUnit.SECONDS.sleep(3);
        //开启第四个线程唤醒执行x1方法的线程
        new Thread(x::signalX1).start();
    }
}

class X{
    int num = 1;
    Lock lock = new ReentrantLock();
    Condition condition01 = lock.newCondition();
    Condition condition02 = lock.newCondition();
    Condition condition03 = lock.newCondition();

    //唤醒执行x1方法的线程
    public void signalX1(){
        System.out.println("into signalX1");
        lock.lock();
        condition01.signal();
        lock.unlock();
    }

    //执行x1、x2、x3方法的线程进入方法后都将阻塞 等待被唤醒
    public void x1(){
        System.out.println("into x1");
        lock.lock();
        try{
            condition01.await();
            System.out.println("x1");
            condition02.signal();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            lock.unlock();
        }
    }
    public void x2(){
        System.out.println("into x2");
        lock.lock();
        try{
            condition02.await();
            System.out.println("x2");
            condition03.signal();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            lock.unlock();
        }
    }
    public void x3(){
        System.out.println("into x3");
        lock.lock();
        try{
            condition03.await();
            System.out.println("x3");
            condition01.signal();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            lock.unlock();
        }
    }
}

运行效果

显然,执行x1、x2、x3方法的线程被依次唤醒

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值