在Java中,有两种主要的方法来处理线程间通信:wait/notify
和Condition
。
wait/notify
-
基本概念:
wait
:当一个线程调用对象的wait
方法时,它会暂停执行并且释放掉它持有的那个对象的锁,直到别的线程通知它继续执行。notify
:当一个线程调用对象的notify
方法时,它会唤醒正在等待这个对象锁的某一个线程。notifyAll
:这个方法会唤醒所有等待这个对象锁的线程。
-
使用方法:
- 这些方法都必须在同步代码块中使用,也就是说,必须先获得对象的锁(使用
synchronized
关键字),才能调用这些方法。 - 例如,一个线程可以进入一个
synchronized
方法,然后调用wait
,另一个线程可以进入另一个synchronized
方法并调用notify
,从而唤醒等待的线程。
- 这些方法都必须在同步代码块中使用,也就是说,必须先获得对象的锁(使用
Condition
-
基本概念:
Condition
是从Java 5开始引入的一种更灵活的线程间通信机制。- 它是与
Lock
一起使用的,相当于wait/notify
机制的增强版。
-
使用方法:
- 首先要创建一个
Lock
对象,然后使用这个Lock
对象来创建一个Condition
对象。 await
:类似于wait
,让当前线程等待,并且释放锁。signal
:类似于notify
,唤醒等待的线程。signalAll
:类似于notifyAll
,唤醒所有等待的线程。
- 首先要创建一个
区别
-
灵活性:
Condition
提供了更大的灵活性,比如可以有多个条件队列,而wait/notify
只能有一个。
-
可读性和控制力:
Condition
的代码通常更清晰,因为你可以使用不同的Condition
实例来表示不同的等待条件。Lock
和Condition
组合使用时,你可以更精细地控制线程的执行顺序和同步逻辑。
-
功能:
Condition
可以在任意的Lock
实现上使用,而wait/notify
只能在内置的对象锁(synchronized)上使用。
总结一下,wait/notify
就像是基本的线程间通信工具,比较简单,但不够灵活。而Condition
则是更高级的工具,提供了更多的功能和更好的可读性。如果你的需求比较简单,用wait/notify
就够了;如果需要更复杂的控制,用Condition
会更好。