簡體   English   中英

ExecutorCompletionService 和 FixedThreadPool 執行器的區別

[英]Difference between a ExecutorCompletionService and a FixedThreadPool executor

據我所知,無論任務在入站隊列中的請求順序如何,執行器完成服務都提供未來對象的輸出,即無論哪個任務先完成,結果都被放入出站隊列。 另一方面, FixedThreadPool也是並行執行任務,那么兩者有什么區別呢? (不確定FixedThreadPool是否按照任務被送入入站隊列的順序依次給出輸出)

謝謝。

FixedThreadPoolExecutor的變體之一。 它使用類ThreadPoolExecutorcorePoolSizemaximumPoolSize相同值。 這意味着,如果您創建具有 10 個線程的FixedThreadPool ,它將始終保持精確的 10 個線程。 如果這些線程中的任何一個因運行任務而終止 - 線程池將創建新線程以保持所需數量。

CompletionService 安排提交的任務在完成后放入隊列。

這意味着,提交任務的所有結果都將在隊列中,您可以稍后處理它們。 當您向CompletionService提交任務時,它會創建一個包裝器,因此異步任務的結果將保存到隊列中。 它本身不會創建並行性,而是CompletionServiceExecutor內部使用來創建並行線程。 例如,您可以在內部傳遞FixedThreadPool

所有提交到FixedThreadPoolCompletionService任務將並行完成,不保持順序。

當您需要知道所有任務何時CompletionService可以使用CompletionService 例子:

//Task extends Callable<Result>
List<Task> tasks = new ArrayList<Task>();
CompletionService<Result> cs = new ExecutorCompletionService<Result>(Executors.newFixedThreadPool(10));
tasks.forEach(task -> cs.submit(task));
for (int i = 0; i < tasks.size(); i++) { // you should know exact amount of submitted tasks
    Result r = cs.take().get();
    //process r
}

FixedThreadPool可用於任何其他情況,當您想在不等待結果的情況下並行線程時。

另外,請注意FixedThreadPoolCachedThreadPool之間的區別。 第一個通常在您需要保持線程活動並限制線程數量時使用。 秒數受系統限制,它會並行處理盡可能多的線程。 如果一個線程在CachedThreadPool中處於空閑狀態,它會在超時后被自動刪除(默認為 60 秒)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM