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();
    }
    }
    }

  • 相关阅读:
    scrapy-redis 分布式爬虫
    爬虫-框架-Scrapy
    MongoDB
    爬虫-请求库之-selenium
    通过位异或来交换a,b的值和通过中间变量交换a,b的值
    位运算
    sizeof运算符
    运算符和表达式(类型转换)
    为什么计算机存储的是二进制补码?
    各种进制的学习与转换
  • 原文地址:https://www.cnblogs.com/wueryuan/p/12073090.html
Copyright © 2011-2022 走看看