0%

16.6 线程通信

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 线程通信