简单了解下Condition接口的使用

假设有些线程要满足某些条件才能继续执行下去,比如要先等待某些其他的线程执行完某些逻辑才能继续,这时候就可使用Condition的await方法,让该线程进入阻塞状态,然后等其他线程处理完该线程需要的前置条件后,在通过signal()方法或signalAll()方法,然后等待着这个条件的线程就会被JVM唤醒,愉快的继续自己的逻辑了。

简单的实例代码:

public class SpringbootApplication {
    private ReentrantLock reentrantLock = new ReentrantLock();

    private Condition condition = reentrantLock.newCondition();

    private volatile boolean flag = false;

    public void A() {
        reentrantLock.lock();
        try {
            if (flag == false) {
                System.out.println("flag条件不满足,等待");
                //条件不满足,阻塞
                condition.await();
            }
            if (flag == true) {
                System.out.println("flag条件满足了,开始做业务");
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            reentrantLock.unlock();
        }
    }


    public void B() {
        reentrantLock.lock();
        try {
            //假设修改条件的业务要执行5秒
            TimeUnit.SECONDS.sleep(5);
            flag = true;
            System.out.println("修改flag条件,唤醒阻塞线程");
            //唤醒阻塞线程
            condition.signal();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            reentrantLock.unlock();
        }
    }


    public static void main(String[] args) throws Exception {
        SpringbootApplication conditionDemo = new SpringbootApplication();
        
        new Thread(new Runnable() {
            @Override
            public void run() {
                conditionDemo.B();
            }
        }).start();
        
        conditionDemo.A();
    }
}

运行结果如下:
在这里插入图片描述
从运行结果可以看到,flag改为true后,就唤醒等待该条件的线程,这个线程就能够继续执行业务逻辑了。

总结

当线程需要等待某种条件才能继续运行时,可以使用Condition接口来实现这个功能。

原创文章 358 获赞 387 访问量 7万+

猜你喜欢

转载自blog.csdn.net/weixin_38106322/article/details/105725967
今日推荐