簡體   English   中英

java中是否有默認的線程池

[英]Is there a default thread pool in java

我可以在java中創建一個新的線程池,並使用ExecutorService.newFixedThreadPoolExecutorService.submit方法在其上執行任務。

是否有一個'默認'線程池,我可以在我的java程序中重用所有執行器服務? 或者我只需要創建一個包含默認線程池的單例? C#有一個默認的線程池,在調用Task.Factory.StartNew方法時運行任務。

從Java-8開始,有ForkJoinPool.commonPool() ,默認情況下由許多涉及並行或異步執行的方法使用。 例如, Arrays.parallelSort()或並行Stream API操作使用此池。 您可以使用CompletableFuture類的許多方法(如CompletableFuture.supplyAsync()將您自己的任務提交到此池。

使用單獨的線程池是好的,默認做法,共享線程池是一種(可能是過早的)優化。

通過Java 7,答案是否定的,沒有默認的線程池,建議使用多個線程池。 這是一個很好的分離,可以防止一個任務集合上的阻塞行為干擾另一個任務。

如果您共享線程池,您應該提出以下問題:

  • 日志框架能夠區分任務嗎? (線程是區分的一種方式。)
  • 如果任務池A意外地請求太多線程並被切斷,那么任務池B應該餓死嗎? 當您發現任務池B失敗時,您是否能夠診斷任務池A中的問題?
  • 如果A區塊B應該餓死?

也許你創建類似LightweightThreadpool東西。 您編寫的前5個任務以輕量級方式使用它。 第六個任務......確實如此,除了它還將錯誤寫入磁盤,這些錯誤非常大,有時會有很多錯誤,並且它們沒有被限制。 突然之前,前5個任務都餓死了,不知道是什么擊中了它們,而且,當你編寫這些任務時,你真的相信它們是安全的,可能沒有為這類事件做好准備。

因此,共享線程池就好了,因為在同一台服務器上運行兩個不同的進程是可以的。 您應該首先仔細考慮資源管理,並了解這些任務現在是資源耦合的。 缺省默認的線程池試圖強制您默認使用單獨的線程池,並在共享之前仔細考慮這些問題。

從Java 8開始,答案是肯定的(根據Tagir對這個問題的回答 )。 但是如果你向該線程池提交阻塞任務,你會發現一切都會開始可怕的失敗。

暫無
暫無

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

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