阿特我自己
[email protected]
Hello WvT
16.6 线程通信
16.6 线程通信

当线程在系统内运行时,程序通常无法准确控制线程的轮换执行,但 Java 也提供了一些机制来保证线程协调运行

1. 传统的线程通信

Object 类提供了如下方法,这些方法必须由同步监视器对象来调用。

  • wait() —— 导致当前线程等待,直到其他线程调用同步监听器的 notify() 方法或 notifyAll() 方法来唤醒该线程
  • notify() —— 随机唤醒在此同步监视器上等待的其中一个线程
  • notifyAll() —— 唤醒在此同步监视器上等待的所有线程。

对于使用 synchronized 修饰的同步方法,该实例就是同步监视器,可以在同步方法中直接调用这三个方法

对于使用 synchronized 修饰的同步代码块,同步监视器是括号内的对象,所以必须使用该对象调用这三个方法

2. 使用 Condition 控制线程通信

如果程序不使用 synchronized 关键字来保证同步,而是使用 Lock 对象来保证同步时,Java 提供了一个 Condition 类来保持协调。

使用 Lock 对象的 newCondition() 方法获得 Condition 实例

Condition 类提供了 await()、signal()、signalAll() 方法,与 Object 类提供的三个方法类似

3. 使用阻塞队列(BlockingQueue)控制线程通信

BlockingQueue 是 Queue 的一个子接口,但主要用于控制线程同步。

生产者线程试图向 BlockingQueue 中放入元素时,如果该队列已满,则该线程被阻塞;当消费者线程试图从 BlockingQueue 中取出元素时,如果该队列已空,则线程被阻塞。

BlockingQueue 提供了如下两个支持阻塞的方法

  • put(E e) —— 尝试把E元素放入队列,如果队列已满,则阻塞线程
  • take() —— 尝试从队列的头部取出元素,如果该队列的元素已空,则阻塞该线程

BlockingQueue 有很多实现类,其中 ArrayBlockingQueue 为最常用的实现类

赞赏

发表评论

textsms
account_circle
email

Hello WvT

16.6 线程通信
当线程在系统内运行时,程序通常无法准确控制线程的轮换执行,但 Java 也提供了一些机制来保证线程协调运行 1. 传统的线程通信 Object 类提供了如下方法,这些方法必须由同步监视器对象…
扫描二维码继续阅读
2019-01-12


没有激活的小工具