Java 固定線程數、阻塞式提交任務的 ExecutorService 線程池 原

Java 自帶的 Executors.newFixedThreadPool() 使用 LinkedBlockingQueue 存儲已提交但未處理的任務,這會導致批量處理時 ExecutorService 會短時間內存儲大量的任務在隊列中。

我們基於 ThreadPoolExecutorArrayBlockingQueue 實現了 newFixedThreadPool 的阻塞式提交任務版本:

private int THREAD_NUM = 4;

private ExecutorService executor = new ThreadPoolExecutor(
        THREAD_NUM, THREAD_NUM,
        0L, TimeUnit.MILLISECONDS,
        new ArrayBlockingQueue<>(THREAD_NUM), // 未處理的任務的等待隊列
        (r, executor) -> {
            try {
                executor.getQueue().put(r);
            } catch (InterruptedException e) {
                throw new RejectedExecutionException("interrupted", e);
            }
        }
);

在執行 executor.submit() 時,如果等待隊列已滿,此時線程池已取過任務在滿負荷執行,當前線程將阻塞地等待隊列有空閒。

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