簡體   English   中英

如何為所有CompletableFuture全局設置線程池

[英]How to globally set thread pool for all CompletableFuture

我試圖通過EA( ea-async )使用async / await庫來模仿Java中Javascript中的單線程異步編程。 這主要是因為我的程序中沒有持久的CPU綁定計算,並且我想用Java編寫無單線程鎖定的代碼。

ea-async庫在很大程度上依賴於Java中的CompletableFuture,而Java下面似乎使用ForkJoinPool來運行異步回調。 由於我的CPU是多核,這使我進入了多線程環境。 似乎對於每個CompletableFuture任務,我都可以使用自定義線程池執行程序來提供異步。 我可以為此提供Executors.newSingleThreadExecutor() ,但我需要一種全局設置此方法的方法,以便所有CompletableFuture在單個JVM進程中都將使用此執行器。 我該怎么做呢?

ea-async庫在很大程度上依賴於Java中的CompletableFuture,而Java下面似乎使用ForkJoinPool來運行異步回調。

那是CompleteableFuture的默認行為:

所有沒有顯式Executor參數的異步方法都是使用ForkJoinPool.commonPool()執行的(除非它不支持並行度至少為2,在這種情況下,將創建一個新的Thread來運行每個任務)。 對於子類中的非靜態方法,可以通過定義方法defaultExecutor()來重寫此方法。

這是該類的定義特征,因此,如果您使用的是CompleteableFuture類(而不是子類),並且在未顯式指定Executor情況下生成實例,那么您將獲得ForkJoinPool

當然,如果您控制提供給ea-async的CompletableFuture ,則可以選擇提供一個子類實例,該子類定義您喜歡的defaultExecutor() 或者,您可以通過靜態工廠方法創建CompleteableFuture對象,該方法允許您顯式指定要使用的Executor ,例如runAsync​(Runnable, Executor)

但這可能不是您真正想做的

如果只使用一個執行程序,則可以相對於提交任務的線程異步執行任務,是的, 但是它們將相對於彼此進行序列化 您的確只有一個線程在處理它們,但是它隨時會在特定的線程上工作,無論響應實際到達的順序如何,都堅持使用該線程直到完成為止。 如果這令人滿意,則不清楚為什么要使用異步操作。

由於我的CPU是多核,這使我進入了多線程環境。

無論您的CPU有多少個內核,它都會使您處於多個線程中。 這就是Executor 就做 ,甚至Executors.newSingleThreadExecutor() 他們提供的就是“異步”的感覺。

如果我理解正確,那么您正在尋找使用一個線程將I / O復用到多個遠程Web應用程序的方法。 那就是java.nio.channels.Selector目的,但是使用它通常需要您自己管理I / O操作或使用旨在與選擇器互操作的接口。 如果您被鎖定在不能使用Selector的第三方接口上,那么多線程和多處理是唯一可行的選擇。

在評論中,您寫道:

我開始認為,BlockingQueue可能會完成將所有API響應合並為一個隊列的工作,作為單個線程將在其上工作的任務。

再說一次,我不認為您想要隨之而來的一切,如果實際上您想要,那么我不明白為什么同步而不是異步工作會更好,更容易。

暫無
暫無

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

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