多线程编程中的等待/通知机制和等待超时模式

1. 等待/通知机制

等待/通知机制,是指WaitThread首先获取了对象的锁,然后调用对象的wait()方法,从而放弃了锁进入了对象的等待队列中,进入等待状态。NotifyThread随后获取了对象的锁,并调用对象的notify()或notifyAll()方法,将Wai
tThread从等待队列中移到同步队列中,此时等待线程的状态变为阻塞状态。
下面分别针对等待方(消费者)和通知方(生产者)进行阐述。

等待方遵循以下原则

  1. 获取对象的锁
  2. 如果条件不满足,那么调用对象的wait()方法,被通知后仍要检查条件
  3. 条件满足则执行后续操作

对应的伪代码如下所示

synchronized(对象){
    while(条件不满足) {
        对象.wait();
    }
    执行后续操作
}

通知方遵循以下原则

  1. 获得对象的锁
  2. 改变条件
  3. 通知所有等待在对象上的线程

对应的伪代码

synchronized(对象){
    改变条件
    对象.notifyAll();
}

2. 等待超时模式

等待超时模式就是在等待/通知机制上增加了超时控制,即使方法执行时间过长,也不会永久阻塞调用者,而是会按照调用者的要求按时返回。

public synchronized Object get(long mills) throws InterruptedException {
    long future = System.currentTimeMillis() + mills;
    long remaining = mills;
    //当超时大于0并且result返回值不满足条件
    while ((result == null) && remaining > 0) {
        wait(remaining);
        remaining = future - System.currentTimeMillis();
    }
    return result;
}

你可能感兴趣的:(Java并发编程)