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

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;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值