JAVA-基础语法-多线程基础-Condition

举报
Photon2 发表于 2020/12/20 11:10:08 2020/12/20
【摘要】 JAVA-基础语法-多线程基础-

Condition

使用Condition对象来实现waitnotify的功能。

上述的TaskQueue可以用condition实现。

class TaskQueue {
   private final Lock lock = new ReentrantLock();
   private final Condition condition = lock.newCondition();
   private Queue<String> queue = new LinkedList<>();

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

   public String getTask() {
       lock.lock();
       try {
           while (queue.isEmpty()) {
               condition.await();
          }
           return queue.remove();
      } finally {
           lock.unlock();
      }
  }
}

await()signal()signalAll()原理和synchronized锁对象的wait()notify()notifyAll()是一致的

tryLock()类似,await()可以在等待指定时间后,如果还没有被其他线程通过signal()signalAll()唤醒,可以自己醒来:

if (condition.await(1, TimeUnit.SECOND)) {
   // 被其他线程唤醒
} else {
   // 指定时间内没有被其他线程唤醒
}

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。