16.6 线程通信
16.6.1 传统的线程通信
假设现在系统中有两个线程,这两个线程分别代表存款者和取钱者—现在假设系统有一种特殊的要求,系统要求存款者和取钱者不断地重复存款、取钱的动作,而且要求每当存款者将钱存入指定账户后,取钱者就立即取出该笔钱。不允许存款者连续两次存钱,也不允许取钱者连续两次取钱。
线程通信方法必须有同步资源监视器调用
为了实现这种功能,可以借助于Object
类提供的wait()
、 notify()
和notifyAll()
三个方法,这三个方法并不属于Thread
类,而是属于Object
类。但这三个方法必须由同步监视器对象
来调用,这可分成以下两种情况。
- 对于使用
synchronized
修饰的同步代码块,同步监视器是synchronized
后括号里的对象,所以必须使用该对象调用这三个方法. - 对于使用
synchronized
修饰的同步方法,因为该类的默认实例(this
)就是同步监视器,所以可以在同步方法中直接调用这三个方法.
线程通信方法介绍
关于这三个方法的解释如下:
方法 | 描述 |
---|---|
wait() |
导致当前线程等待,直到其他线程调用该同步监视器 的notify() 方法或notifyAll() 方法来唤醒该线程。该wait() 方法有三种形式——无时间参数的wait() 一直等待,直到其他线程通知)、带毫秒参数的wait() 和带毫秒、毫微秒参数的wait() 这两种方法都是等待指定时间后自动苏醒)。调用wait() 方法的当前线程会释放对该同步监视器的锁定。 |
notify() |
唤醒在此同步监视器上 等待的单个线程。如果所有线程都在此同步监视器上等待,则会任意选择唤醒其中的一个线程。但要等到当前线程放弃对该同步监视器的锁定后(使用wait() 方法),才可以执行被唤醒的线程。 |
notifyAll() |
唤醒在此同步监视器上等待的所有线程。但要等到当前线程放弃对该同步监视器的锁定后,才可以执行被唤醒的线程 |
原文链接: 16.6 线程通信