CountDownLatchとは何ですか?
CountDownLatch
これはjava 1.5 で導入され、それとともに導入されたコンカレントユーティリティクラスにも、、、CyclicBarrier
およびSemaphore
がConcurrentHashMap
あり、BlockingQueue
それらはすべてjava.util.concurrentパッケージの下に存在します。CountDownLatchクラスを使用すると、スレッドは他のスレッドが処理を完了するのを待ってから実行できます。たとえば、アプリケーションのメインスレッドは、フレームワークサービスの開始を担当するスレッドがすべてのフレームワークサービスを開始した後で実行する必要があります。
CountDownLatchはoneによって実装され计数器
ます。カウンターの初期値はスレッドの数です。スレッドがタスクを完了するたびに、カウンター値は1ずつ減少します。カウンター値が0に達すると、すべてのスレッドがタスクを完了したことを示し、ロックを待機しているスレッドがタスクの実行を再開できます。
CountDownLatchのコアポイントは「ブロックがすぐに待機し、カウントダウンカウントが上がる」です。
countDownLatch.await(10、TimeUnit.MILLISECONDS)に関して可选时间参数
は、追加のブロッキングキャンセル条件があり、カウントが0になり、時間が0に達すると、条件の1つが満たされ、ブロッキング待機スレッドを解放できます。
この小さなデモを実行できます
package com.bestksl.example.aqs;
import lombok.extern.slf4j.Slf4j;
import java.util.concurrent.*;
@Slf4j
public class CountDownLatchExample2 {
static final int clientTotal = 500; //并发总计数
static final int threadTotal = 20; //并发线程最大值
public static void main(String[] args) {
CountDownLatch countDownLatch = new CountDownLatch(clientTotal);
Semaphore semaphore = new Semaphore(threadTotal);
ExecutorService executorService = Executors.newCachedThreadPool();
for (int i = 0; i < clientTotal; i++) {
final int n = i;
executorService.execute(() -> {
try {
semaphore.acquire();
p(n);
semaphore.release();
} catch (InterruptedException e) {
log.info(e.getMessage());
} finally {
countDownLatch.countDown(); // 因为只是示范, 所以放到了finally中保证计数, 如有特殊情况应该加入处理逻辑
}
});
}
executorService.execute(() -> {
try {
countDownLatch.await(10, TimeUnit.MILLISECONDS);// 加上时间参数可以强行到时激活await()
System.out.println("done");
} catch (InterruptedException e) {
e.printStackTrace();
}
});
executorService.shutdown();
}
//并发方法
private static void p(int n) throws InterruptedException {
Thread.sleep(200);
log.info(n + "");
Thread.sleep(200);
}
}