package com.example;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
public class CountDownLatchDemo {
public static void main(String[] args) throws InterruptedException {
final MyNumber myNumber = new MyNumber();
AtomicInteger integer = new AtomicInteger(0);
int threadCount = Runtime.getRuntime().availableProcessors();
ExecutorService executorService = Executors.newFixedThreadPool(threadCount);
final CountDownLatch concurrentLatch = new CountDownLatch(threadCount);
final CountDownLatch concurrentLatchV2 = new CountDownLatch(threadCount);
final CountDownLatch completedLatch = new CountDownLatch(threadCount);
System.out.println("threadCount: " + threadCount);
for (int i = 0; i < threadCount; i++) {
executorService.execute(new Runnable() {
@Override
public void run() {
try {
// 保證同時併發
concurrentLatch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
for (int i = 0; i < 10000; i++) {
myNumber.increase();
}
try {
concurrentLatchV2.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
for (int i = 0; i < 10000; i++) {
integer.incrementAndGet();
}
completedLatch.countDown();
}
});
concurrentLatch.countDown();
concurrentLatchV2.countDown();
}
completedLatch.await();
System.out.println("result: " + myNumber.value());
System.out.println("resultV2: " + integer.get());
// shutdown
// 啓動有序關閉,其中執行先前提交的任務,但不會接受新任務。 如果已經關閉,調用沒有額外的效果。
// 此方法不等待先前提交的任務完成執行。 使用awaitTermination來做到這一點。
executorService.shutdown();
// maximum wait 1000 ms
// awaitTermination
// 阻塞直到所有任務在關閉請求後完成執行,或發生超時,或當前線程被中斷,以先發生者爲準。
if (!executorService.awaitTermination(1000, TimeUnit.MILLISECONDS)) {
// shutdownNow
// 嘗試停止所有正在執行的任務,停止等待任務的處理,並返回等待執行的任務列表。
// 此方法不會等待主動執行的任務終止。 使用awaitTermination來做到這一點。
// 除了盡力嘗試停止處理正在執行的任務之外,沒有任何保證。 例如,典型的實現將通過Thread.interrupt取消,因此任何未能響應中斷的任務可能永遠不會終止。
executorService.shutdownNow();
}
if (!executorService.isShutdown()) {
System.out.println("executorService still not shutdown.");
}
}
private static class MyNumber {
private int num = 0;
public void increase() {
num++;
}
public int value() {
return num;
}
}
}
使用CountDownLatch進行併發測試
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.