CountDownLatch 類別
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
一種同步輔助工具,允許一個或多個執行緒等待其他執行緒執行的一組操作完成。
[Android.Runtime.Register("java/util/concurrent/CountDownLatch", DoNotGenerateAcw=true)]
public class CountDownLatch : Java.Lang.Object
[<Android.Runtime.Register("java/util/concurrent/CountDownLatch", DoNotGenerateAcw=true)>]
type CountDownLatch = class
inherit Object
- 繼承
- 屬性
備註
一種同步輔助工具,允許一個或多個執行緒等待其他執行緒執行的一組操作完成。
A CountDownLatch 以特定的 <em>計數</em> 初始化。
#await await方法會阻塞直到目前計數歸零(因#countDown呼叫方法)而歸零,之後所有等待執行緒會被釋放,後續的回傳#await await呼叫也會立即被釋放。 這是一次性的現象——計數無法重置。 如果你需要一個能重置計數的版本,可以考慮使用 CyclicBarrier。
A CountDownLatch 是一種多功能的同步工具,可用於多種用途。
CountDownLatch初始化為一的執行緒作為簡單的開/關鎖,或稱閘:所有呼叫#await await的執行緒都會在閘口等待,直到呼叫執行緒#countDown開啟閘門。
CountDownLatch初始化為 <em>N</em> 的執行緒可以用來讓一個執行緒等待,直到 <em>N</em> 執行緒完成某個動作,或某個動作完成 N 次。
a CountDownLatch 的一個實用特性是,呼叫執行緒 countDown 時不必等計數歸零後才能繼續,而是防止任何執行緒在所有執行緒通過前繼續 #await await 。
<b>範例用法:</b> 這裡有一對類別,其中一組工作線程使用兩個倒數計時鎖存: <ul><li>第一個是啟動信號,阻止任何工作者繼續,直到驅動程式準備好 <;第二個>是完成信號,允許司機等待所有工人完成。 </ul>
{@code
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 描述每個部分,並將所有 Runnables 排隊給執行者。 當所有子部分完成後,協調線程即可通過等待。 (當執行緒必須反覆以這種方式倒數時,改用 CyclicBarrier。)
{@code
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() {
doWork();
doneSignal.countDown();
}
void doWork() { ... }
}}
記憶體一致性效應:在計數歸零之前,執行緒 countDown()<中呼叫前的動作發生於 i>之前/<i> 行動,這是在另一個執行緒中成功回傳對應 await() 的
已在1.5中新增。
Java 文件 java.util.concurrent.CountDownLatch。
本頁部分內容為基於 Open Source Project 所創建與分享的作品,並依授權條款所描述的使用進行修改。
建構函式
| 名稱 | Description |
|---|---|
| CountDownLatch(Int32) |
構造 a |
| CountDownLatch(IntPtr, JniHandleOwnership) |
用於建立 JNI 物件受管理表示的建構器;由執行時呼叫。 |
屬性
| 名稱 | Description |
|---|---|
| Class |
回傳此 |
| Count |
回傳目前的計數。 |
| Handle |
底層 Android 實例的帳號。 (繼承來源 Object) |
| JniIdentityHashCode |
取得由互通執行時指派給此 Java 對等端的身份雜湊碼。 (繼承來源 Object) |
| JniManagedPeerState |
一種同步輔助工具,允許一個或多個執行緒等待其他執行緒執行的一組操作完成。 (繼承來源 JavaObject) |
| JniPeerMembers |
一種同步輔助工具,允許一個或多個執行緒等待其他執行緒執行的一組操作完成。 |
| PeerReference |
取得這個 Java 節點的 JNI 物件參考。 (繼承來源 Object) |
| ThresholdClass |
此 API 支援 Mono for Android 基礎架構,並非直接從你的程式碼中使用。 |
| ThresholdType |
此 API 支援 Mono for Android 基礎架構,並非直接從你的程式碼中使用。 |
方法
| 名稱 | Description |
|---|---|
| Await() |
會讓目前執行緒等待到鎖存倒數歸零,除非執行緒被 Thread#interrupt 中斷。 |
| Await(Int64, TimeUnit) |
會讓目前執行緒等待到鎖存倒數歸零,除非執行緒被 Thread#interrupt 中斷,或指定的等待時間已過。 |
| AwaitAsync() |
非同步等待直到鎖存數歸零。 |
| AwaitAsync(Int64, TimeUnit) |
非同步等待直到鎖存數歸零或指定的等待時間結束。 |
| Clone() |
建立並回傳此物件的副本。 (繼承來源 Object) |
| Construct(JniObjectReference, JniObjectReferenceOptions) |
一種同步輔助工具,允許一個或多個執行緒等待其他執行緒執行的一組操作完成。 (繼承來源 JavaObject) |
| CountDown() |
減少鎖存次數,若計數歸零則釋放所有等待執行緒。 |
| Dispose() |
釋放該 Java 節點所持有的資源。 (繼承來源 Object) |
| Dispose(Boolean) |
釋放該 Java 節點所持有的資源。 (繼承來源 Object) |
| DisposeUnlessReferenced() |
一種同步輔助工具,允許一個或多個執行緒等待其他執行緒執行的一組操作完成。 (繼承來源 JavaObject) |
| Equals(Object) |
一種同步輔助工具,允許一個或多個執行緒等待其他執行緒執行的一組操作完成。 (繼承來源 JavaObject) |
| Equals(Object) |
表示是否有其他物體「等同」於此物。 (繼承來源 Object) |
| GetHashCode() |
回傳物件的雜湊碼值。 (繼承來源 Object) |
| JavaFinalize() |
已淘汰.
當垃圾回收判定該物件不再有相關參考時,由垃圾回收器呼叫。 (繼承來源 Object) |
| Notify() |
喚醒一個正在該物件監視器上等待的執行緒。 (繼承來源 Object) |
| NotifyAll() |
喚醒所有等待該物件監視器的執行緒。 (繼承來源 Object) |
| SetHandle(IntPtr, JniHandleOwnership) |
設定 Handle 屬性。 (繼承來源 Object) |
| SetPeerReference(JniObjectReference, JniObjectReferenceOptions) |
一種同步輔助工具,允許一個或多個執行緒等待其他執行緒執行的一組操作完成。 (繼承來源 JavaObject) |
| ToArray<T>() |
從這個 Java 陣列包裝器建立一個受管理陣列。 (繼承來源 Object) |
| ToString() |
回傳物件的字串表示。 (繼承來源 Object) |
| UnregisterFromRuntime() |
將此 Java 節點從互通執行時中取消註冊。 (繼承來源 Object) |
| Wait() |
導致目前執行緒等待被喚醒,通常是透過 <em>通知</><em 或 em>中斷</em> 來喚醒。 (繼承來源 Object) |
| Wait(Int64, Int32) |
會讓目前執行緒等待喚醒,通常是透過 <em>通知</><em 或 em>中斷</em>,或是經過一定的真實時間。 (繼承來源 Object) |
| Wait(Int64) |
會讓目前執行緒等待喚醒,通常是透過 <em>通知</><em 或 em>中斷</em>,或是經過一定的真實時間。 (繼承來源 Object) |
明確介面實作
| 名稱 | Description |
|---|---|
| IJavaPeerable.Disposed() |
一種同步輔助工具,允許一個或多個執行緒等待其他執行緒執行的一組操作完成。 (繼承來源 JavaObject) |
| IJavaPeerable.Finalized() |
一種同步輔助工具,允許一個或多個執行緒等待其他執行緒執行的一組操作完成。 (繼承來源 JavaObject) |
| IJavaPeerable.JniObjectReferenceControlBlock |
一種同步輔助工具,允許一個或多個執行緒等待其他執行緒執行的一組操作完成。 (繼承來源 JavaObject) |
| IJavaPeerable.SetJniIdentityHashCode(Int32) |
一種同步輔助工具,允許一個或多個執行緒等待其他執行緒執行的一組操作完成。 (繼承來源 JavaObject) |
| IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates) |
一種同步輔助工具,允許一個或多個執行緒等待其他執行緒執行的一組操作完成。 (繼承來源 JavaObject) |
| IJavaPeerable.SetPeerReference(JniObjectReference) |
一種同步輔助工具,允許一個或多個執行緒等待其他執行緒執行的一組操作完成。 (繼承來源 JavaObject) |
擴充方法
| 名稱 | Description |
|---|---|
| GetJniTypeName(IJavaPeerable) |
取得實例 |
| JavaAs<TResult>(IJavaPeerable) |
試著強制 |
| JavaCast<TResult>(IJavaObject) |
執行 Android 執行時檢查型別轉換。 |
| JavaCast<TResult>(IJavaObject) |
一種同步輔助工具,允許一個或多個執行緒等待其他執行緒執行的一組操作完成。 |
| TryJavaCast<TResult>(IJavaPeerable, TResult) |
試著強制 |