Java ThreadPoolShutdown

CountDownLatch 是 Java 中的一個同步工具類,它允許一個或多個線程等待一系列指定操作執行完成。CountDownLatch 的主要方法有兩個:await() 方法等待 countDown 方法被調用指定的次數後繼續執行,countDown 方法遞減計數器,每次調用都會減少計數器的值。

如果你想要使用 CountDownLatch 來關閉線程,你可以這樣做:

  1. 創建一個 CountDownLatch 實例,並指定初始計數值。

  2. 每個需要等待的線程在開始執行的地方調用 await 方法。

  3. 當所有需要等待的操作完成時,調用 countDown 方法。

  4. 如果你想關閉線程,可以通過調用 countDown 方法來減少 CountDownLatch 的計數值。

下面是一個簡單的例子,展示瞭如何使用 CountDownLatch 來關閉線程:

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
 
public class ThreadPoolShutdown {
    public static void main(String[] args) {
        int numberOfTasks = 10;
        CountDownLatch doneSignal = new CountDownLatch(numberOfTasks);
        ExecutorService executor = Executors.newFixedThreadPool(5);
 
        for (int i = 0; i < numberOfTasks; i++) {
            executor.execute(new RunnableTask(doneSignal, i));
        }
 
        try {
            doneSignal.await(); // 等待所有任務完成
        } catch (InterruptedException e) {
            e.printStackTrace();
            executor.shutdownNow(); // 中斷等待過程中,立即關閉線程池
        }
 
        executor.shutdown(); // 正常關閉線程池
    }
 
    static class RunnableTask implements Runnable {
        private final CountDownLatch doneSignal;
        private final int i;
 
        RunnableTask(CountDownLatch doneSignal, int i) {
            this.doneSignal = doneSignal;
            this.i = i;
        }
 
        @Override
        public void run() {
            try {
                System.out.println("Task " + i + " is executing");
                Thread.sleep((long) (Math.random() * 10000));
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                doneSignal.countDown(); // 每個任務完成時減少計數器
            }
        }
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章