zoukankan      html  css  js  c++  java
  • 使用Condition

    /**

    * ReentrantLock使用Condition对象来实现wait和notify的功能
    * 使用Condition时,引用的Condition对象必须从Lock实例的newCondition()返回,这样才能获得一个绑定了Lock实例的Condition实例
    * Condition提供的await()、signal()、signalAll()原理和synchronized锁对象的wait()、notify()、notifyAll()是一致的,并且其行为也是一样的
    * await()会释放当前锁,进入等待状态
    * signal()会唤醒某个等待线程;
    * signalAll()会唤醒所有等待线程;
    * 唤醒线程从await()返回后需要重新获得锁。
    */
    class TestCondition{
    private final Lock lock = new ReentrantLock();
    private final Condition condition = lock.newCondition();
    private Queue<String> queue = new LinkedList<>();

    public void addTask(String task){
    lock.lock();
    try {
    queue.add(task);
    condition.signalAll();
    } finally {
    lock.unlock();
    }
    }

    public String getTask() {
    lock.lock();
    try {
    while (queue.isEmpty()) {
    try {
    condition.await();
    /*if(condition.await(1, TimeUnit.SECONDS)){
    //被其他线程唤醒
    }else{
    //指定时间内没有被其他线程唤醒
    }*/
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    }
    return queue.remove();
    } finally {
    lock.unlock();
    }
    }
    }

  • 相关阅读:
    第六周
    第五周(实验报告)
    第四周(实验报告)
    第三周(实验报告)
    Java第二周学习总结
    第一周
    2019课程总结
    第十四周课程总结
    第十三周总结
    第十二周总结
  • 原文地址:https://www.cnblogs.com/wueryuan/p/12073090.html
Copyright © 2011-2022 走看看