|
JavaTM 2 Platform Standard Ed. 6 |
|||||||||
上一個類別 下一個類別 | 框架 無框架 | |||||||||
摘要: 巢狀 | 欄位 | 建構子 | 方法 | 詳細資訊: 欄位 | 建構子 | 方法 |
java.lang.Object java.util.concurrent.CountDownLatch
public class CountDownLatch
一個同步輔助類別,在完成一組正在其他執行緒中執行的操作之前,它允許一個或多個執行緒一直等待。
用給定的計數 初始化 CountDownLatch
。由於調用了 countDown()
方法,所以在當前計數到達零之前,await
方法會一直受阻塞。之後,會釋放所有等待的執行緒,await
的所有後續調用都將立即返回。這種現象只出現一次——計數無法被重置。如果需要重置計數,請考慮使用 CyclicBarrier
。
CountDownLatch
是一個通用同步工具,它有很多用途。將計數 1 初始化的 CountDownLatch
用作一個簡單的開/關鎖存器,或入口:在通過調用 countDown()
的執行緒打開入口前,所有調用 await
的執行緒都一直在入口處等待。用 N 初始化的 CountDownLatch
可以使一個執行緒在 N 個執行緒完成某項操作之前一直等待,或者使其在某項操作完成 N 次之前一直等待。
CountDownLatch
的一個有用特性是,它不要求調用 countDown
方法的執行緒等到計數到達零時才繼續,而在所有執行緒都能通過之前,它只是阻止任何執行緒繼續通過一個 await
。
範例用法: 下面給出了兩個類別,其中一組 worker 執行緒使用了兩個倒計數鎖存器:
class Driver { // ... void main() throws InterruptedException { CountDownLatch startSignal = new CountDownLatch(1); CountDownLatch doneSignal = new CountDownLatch(N); for (int i = 0; i < N; ++i) // create and start threads new Thread(new Worker(startSignal, doneSignal)).start(); doSomethingElse(); // don't let run yet startSignal.countDown(); // let all threads proceed doSomethingElse(); doneSignal.await(); // wait for all to finish } } class Worker implements Runnable { private final CountDownLatch startSignal; private final CountDownLatch doneSignal; Worker(CountDownLatch startSignal, CountDownLatch doneSignal) { this.startSignal = startSignal; this.doneSignal = doneSignal; } public void run() { try { startSignal.await(); doWork(); doneSignal.countDown(); } catch (InterruptedException ex) {} // return; } void doWork() { ... } }
另一種典型用法是,將一個問題分成 N 個部分,用執行每個部分並讓鎖存器倒計數的 Runnable 來描述每個部分,然後將所有 Runnable 加入到 Executor 佇列。當所有的子部分完成後,協調執行緒就能夠通過 await。(當執行緒必須用這種方法反覆倒計數時,可改為使用 CyclicBarrier
。)
class Driver2 { // ... void main() throws InterruptedException { CountDownLatch doneSignal = new CountDownLatch(N); Executor e = ... for (int i = 0; i < N; ++i) // create and start threads e.execute(new WorkerRunnable(doneSignal, i)); doneSignal.await(); // wait for all to finish } } class WorkerRunnable implements Runnable { private final CountDownLatch doneSignal; private final int i; WorkerRunnable(CountDownLatch doneSignal, int i) { this.doneSignal = doneSignal; this.i = i; } public void run() { try { doWork(i); doneSignal.countDown(); } catch (InterruptedException ex) {} // return; } void doWork() { ... } }
記憶體一致性效果:執行緒中調用 countDown()
之前的操作 happen-before 緊跟在從另一個執行緒中對應 await()
成功返回的操作。
建構子摘要 | |
---|---|
CountDownLatch(int count)
建構一個用給定計數初始化的 CountDownLatch 。 |
方法摘要 | |
---|---|
void |
await()
使當前執行緒在鎖存器倒計數至零之前一直等待,除非執行緒被中斷。 |
boolean |
await(long timeout,
TimeUnit unit)
使當前執行緒在鎖存器倒計數至零之前一直等待,除非執行緒被中斷或超出了指定的等待時間。 |
void |
countDown()
遞減鎖存器的計數,如果計數到達零,則釋放所有等待的執行緒。 |
long |
getCount()
返回當前計數。 |
String |
toString()
返回標識此鎖存器及其狀態的字元串。 |
從類別 java.lang.Object 繼承的方法 |
---|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait |
建構子詳細資訊 |
---|
public CountDownLatch(int count)
CountDownLatch
。
count
- 在執行緒能通過 await()
之前,必須調用 countDown()
的次數
IllegalArgumentException
- 如果 count
為負方法詳細資訊 |
---|
public void await() throws InterruptedException
如果當前計數為零,則此方法立即返回。
如果當前計數大於零,則出於執行緒排程目的,將禁用當前執行緒,且在發生以下兩種情況之一前,該執行緒將一直處於休眠狀態:
countDown()
方法,計數到達零;或者
如果當前執行緒:
InterruptedException
,並且清除當前執行緒的已中斷狀態。
InterruptedException
- 如果當前執行緒在等待時被中斷public boolean await(long timeout, TimeUnit unit) throws InterruptedException
如果當前計數為零,則此方法立刻返回 true
值。
如果當前計數大於零,則出於執行緒排程目的,將禁用當前執行緒,且在發生以下三種情況之一前,該執行緒將一直處於休眠狀態:
countDown()
方法,計數到達零;或者
如果計數到達零,則該方法返回 true
值。
如果當前執行緒:
InterruptedException
,並且清除當前執行緒的已中斷狀態。
如果超出了指定的等待時間,則返回值為 false
。如果該時間小於等於零,則此方法根本不會等待。
timeout
- 要等待的最長時間unit
- timeout
參數的時間單位。
true
;如果在計數到達零之前超過了等待時間,則返回 false
InterruptedException
- 如果當前執行緒在等待時被中斷public void countDown()
如果當前計數大於零,則將計數減少。如果新的計數為零,出於執行緒排程目的,將重新啟用所有的等待執行緒。
如果當前計數等於零,則不發生任何操作。
public long getCount()
此方法通常用於除錯和測試。
public String toString()
"Count ="
,後跟當前計數。
Object
中的 toString
|
JavaTM 2 Platform Standard Ed. 6 |
|||||||||
上一個類別 下一個類別 | 框架 無框架 | |||||||||
摘要: 巢狀 | 欄位 | 建構子 | 方法 | 詳細資訊: 欄位 | 建構子 | 方法 |
版權所有 2008 Sun Microsystems, Inc. 保留所有權利。請遵守GNU General Public License, version 2 only。