使用CountDownLatch進行併發測試

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; } } }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章