[英]Using CompletableFuture and thread pool for a large number of tasks
[英]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.