使用Condition实现等待/通知

关键字synchronized与wait()和notify()/notifyAll()方法相结合可以实现等待/通知模式,类ReentrantLock也可以实现同样的功能,但需要借助于Condition对象。

Condition类具有很好的灵活性,可以实现多路通知功能,也就是在一个Lock对象里面可以创建多个Condition(即对象监视器)实例,线程对象可以注册在指定的Condition中,从而可以有选择性地进行线程通知,在调度线程上更加灵活。

在使用notify()/notifyAll()方法进行通知时,被通知的线程却是由JVM随机选择的。但是使用ReentrantLock结合Condition类是可以实现前面介绍过的“选择性通知”

而synchronized就相当于整个Lock对象中只有一个单一的Condition对象,所有的线程都注册在它的一个对象身上。线程开始notifyAll()时,需要通知所有WAITING线程,没有选择权,会出现相当大的效率问题。

package other.thread15;

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;


public class DemoService {
    private Lock lock = new ReentrantLock();
    private Condition condition = lock.newCondition();
    
    public void await() {
        try {
            lock.lock();
            System.out.println("await时间为:" + System.currentTimeMillis());
            condition.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }finally {
            lock.unlock();
        }
    }
    
    public void signal() {
        try {
            lock.lock();
            System.out.println("signal时间为:" + System.currentTimeMillis());
            condition.signal();
        }finally {
            lock.unlock();
        }
    }
}
package other.thread15;

public class ThreadA extends Thread {

    private DemoService service;
    
    public ThreadA(DemoService service) {
        this.service = service;
    }
    
    @Override
    public void run() {
        service.await();
    }
}
package other.thread15;

public class Test {

    public static void main(String[] args) throws InterruptedException {
        DemoService service = new DemoService();
        ThreadA threadA = new ThreadA(service);
        threadA.start();
        Thread.sleep(1000);
        service.signal();
    }

}
image.png

成功实现等待/通知模式
Object类中的wait()相当于Condition类中的await()方法。
Object类中的wait(long timeout)相当于Condtion类中的await(long time,TimeUnit unit)方法。
Object类中的notify()方法相当于Condition类中的signal()方法。
Object类中的notifyAll()方法相当于Condition类中的signalAll()方法。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 在Java平台中,Object.wait()/Object.wait(long)以及Object.notify()...
    CodeKing2017阅读 11,702评论 0 4
  • 【JAVA 线程】 线程 进程:是一个正在执行中的程序。每一个进程执行都有一个执行顺序。该顺序是一个执行路径,或者...
    Rtia阅读 7,751评论 2 20
  • 整理来自互联网 1,JDK:Java Development Kit,java的开发和运行环境,java的开发工具...
    Ncompass阅读 5,438评论 0 6
  •   一个任务通常就是一个程序,每个运行中的程序就是一个进程。当一个程序运行时,内部可能包含了多个顺序执行流,每个顺...
    OmaiMoon阅读 5,673评论 0 12
  • 拆书帮30拆便签-21 R:下面两种方式可以有效地帮助你意识到两大关键对话原则,从而很好地改善的对话能力。 一、注...
    歌舒雪阅读 1,346评论 0 0

友情链接更多精彩内容