1. LockSupport工具
1.1 LockSupport的作用
當需要阻塞或喚醒一個線程的時候,都會使用LockSupport工具類來完成相應工作。LockSupport定義了一組公共的靜態方法,這些方法提供了做基本的線程阻塞和喚醒功能。
1.2 LockSupport提供的阻塞和喚醒方法
方法 | 描述 |
---|---|
void park() | 阻塞當前線程,如果調用unpark(Thread)方法或被中斷,才能從park()返回。 |
void parkNanos(long nanos) | 阻塞當前線程的超時返回版本,阻塞時間最長不超過nanos納秒。 |
void parkUntil(long deadline) | 阻塞當前線程,直到deadline時間(從1970年開始到deadline時間的毫秒數)。 |
void unpark(Thread) | 喚醒處于阻塞狀態的線程. |
1.3 LockSupport新增的方法
在Java 6中,LockSupport增加了park(Object blocker)、parkNanos(Object blocker, long nanos)、parkUntil(Object blocker, long deadline)這3個方法,用于實現阻塞當前線程的功能,其中參數blocker是用來標識當前線程在等待的對象,該對象主要用于問題排查和系統監控。
2. Condition接口
2.1 Condition接口的理解
Java對象的wait()、notify()等方法和synchronized關鍵字配合,可以實現等待/通知模式。此外還有一種方式可以實現等待/通知模式:Condition接口與Lock接口配合。
2.2 Condition接口示例
public class ConditionUseCase {Lock lock = new ReentrantLock();Condition condition = lock.newCondition();public void conditionWait() throws InterruptedException {lock.lock();try {condition.await();} finally {lock.unlock();}}public void conditionSingnal() throws InterruptedException {lock.lock();try {condition.signal();} finally {lock.unlock();}}
}
復制代碼
- 1.Condition定義了等待/通知模式的相關方法,并且Condition實例是由鎖創建出來的,在調用Condition的這些方法前需先獲得和Condition對象相關聯的鎖。
- 2.調用await()方法后,當前線程釋放鎖并進入等待狀態,當其他對象調用Condition的signal()方法后當前線程才能從await()方法中返回,且返回前已經獲得了鎖。
2.3 Condition的方法
方法 | 描述 |
---|---|
void await() throws InterruptedException | 當前線程進入等待狀態,直到被通知(signal)或者被中斷。 |
void awaitUninterruptibly() | 當前線程進入等待狀態直到被通知,對中斷不做響應。 |
long awaitNanos(long nanosTimeout) throws InterruptedException | void await() throws InterruptedException方法的超時等待版本,返回值表示當前剩余的時間,如果在nanosTimeout之前被喚醒,返回值 = nanosTimeout - 實際消耗的時間,返回值 <= 0表示超時。 |
boolean awaitUntil(Date deadline) throws InterruptedException | 當前線程進入等待狀態直到被通知、中斷、到達某個時間點。在deadline時間點前線程能被通知或中斷則返回true,否則返回false。 |
void signal() | 喚醒一個等待在Condition上的線程。 |
void signalAll() | 喚醒所有等待在Condition上的線程。 |