[英]Is there a default thread pool in java
我可以在java中創建一個新的線程池,並使用ExecutorService.newFixedThreadPool和ExecutorService.submit方法在其上執行任務。
是否有一個'默認'線程池,我可以在我的java程序中重用所有執行器服務? 或者我只需要創建一個包含默認線程池的單例? C#有一個默認的線程池,在調用Task.Factory.StartNew方法時運行任務。
從Java-8開始,有ForkJoinPool.commonPool()
,默認情況下由許多涉及並行或異步執行的方法使用。 例如, Arrays.parallelSort()
或並行Stream API操作使用此池。 您可以使用CompletableFuture
類的許多方法(如CompletableFuture.supplyAsync()
將您自己的任務提交到此池。
使用單獨的線程池是好的,默認做法,共享線程池是一種(可能是過早的)優化。
通過Java 7,答案是否定的,沒有默認的線程池,建議使用多個線程池。 這是一個很好的分離,可以防止一個任務集合上的阻塞行為干擾另一個任務。
如果您共享線程池,您應該提出以下問題:
也許你創建類似LightweightThreadpool
東西。 您編寫的前5個任務以輕量級方式使用它。 第六個任務......確實如此,除了它還將錯誤寫入磁盤,這些錯誤非常大,有時會有很多錯誤,並且它們沒有被限制。 突然之前,前5個任務都餓死了,不知道是什么擊中了它們,而且,當你編寫這些任務時,你真的相信它們是安全的,可能沒有為這類事件做好准備。
因此,共享線程池就好了,因為在同一台服務器上運行兩個不同的進程是可以的。 您應該首先仔細考慮資源管理,並了解這些任務現在是資源耦合的。 缺省默認的線程池試圖強制您默認使用單獨的線程池,並在共享之前仔細考慮這些問題。
從Java 8開始,答案是肯定的(根據Tagir對這個問題的回答 )。 但是如果你向該線程池提交阻塞任務,你會發現一切都會開始可怕的失敗。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.