线程间的通信

什么是等待通知机制

        在单线程中,要执行的操作需要满足一定的条件才能执行,可以把这个操作放在if语句块中

        在多线程编程中,可能线程a条件没有满足只是暂时的,稍后其他的线程可能会更新这个条件,使得a线程的条件满足,可以将a线程暂停,知道它的条件满足后再将a线程唤醒。

等待/通知机制实现

Object 类中的wait()方法可以使执行当前代码的线程等待,暂停执行,直到接到通知或被中断为止。

注意:

  • wait()方法只能在同步代码块中由锁对象调用
  • 调用wait()方法,当前线程会释放锁            

伪代码:

//在调用wait()方法前获得对象内部的锁

synchronized(锁对象){

        while(条件不成立){

                //通过锁对象调用wait方法暂停线程

                锁对象.wait();

        }

//线程的条件满足继续向下执行

}

        Object类中的notify()可以唤醒线程,该方法也必须在同步代码块中由锁对象调用,没有使用锁对象调用wait 和 notify 会抛出异常。如果有多个等待的线程,notify方法只能唤醒其中一个。

伪代码:

        synchronized(锁对象){

                //执行修改保护条件的代码

                //唤醒线程

                锁对象.notify()

        }

notify不会立即释放锁对象,需要等到当前代码块都执行完才会释放锁对象。

interrupt方法会中断wait()

        当线程处于等待状态时,调用线程对象的interrupt方法会中断线程等待状态,

wait(long)的使用

        wait(long) 带有long类型参数的wait()等待,如果在指定参数指定的时间内没有被唤醒,超时后会自动唤醒。

通知过早

        线程wait等待后,可以

wait等待条件发生了变化

        在使用wait/notify模式时。注意wait条件发生了变化,也可能造成逻辑的混乱

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值