2016-11-24 53 views
2

如何使用ExecutorService的方式爲應用程序級別的應用程序創建一箇中央線程池,該線程池的池大小將根據當時CPU可用的線程數設置,然後不同的時間應用程序的功能按照他們的要求使用來自該中央池的線程。Java ExecutorService

+0

圍繞'ExecutorService'使用一些自定義的包裝,這是一個單例(使用依賴注入也許)? – 2016-11-24 05:42:40

+1

您可以使用'Runtime.getRuntime()。availableProcessors();'來獲得處理器的數量,但我不會推薦使用這個。更好地分析代碼以找到最佳線程數。 –

+0

如果你正在尋找一種方法來計算你的環境可以支持多少線程..這裏是一些..http://stackoverflow.com/questions/763579/how-many-threads-can-a-java-vm-支持 – Sagar

回答

0

從Java 8開始,我建議你使用ForkJoinPool.commonPool()。這是Java提供的唯一全局線程池。

在Java 8之前,您要麼保留自己的線程池,要麼使用您的框架的可共享線程池。

0

貝婁是我的看法:

  • 中央線程池?

    也許吧,說的Singleton Pattern設計模式,我認爲它可以解決你的問題;

  • 根據可用CPU的線程數設置?

    線程池的大小不準確。實際上,大小取決於線程池執行的任務類型。例如,大小可以Runtime.getRuntime().availableProcessors() + 1如果任務CPU密集型,或者是Runtime.getRuntime().availableProcessors() * 2如果任務I/O密集型。但這些都只是基本原則,你應該確定合適的尺寸用一些測試應用程序準則(如Little's_law);

  • 我的建議:

    在實踐中,我很少提交所有任務只有一箇中心threal池,也許應該組的任務按類型,並將其提交給不同的線程池,這將是方便的監控或稍後調整線程池。

希望能幫到你。

+0

謝謝Haolin!當找到當前的JVM線程數時也有問題: - 需要查找標準閾值 快樂案例:如果JVM線程數小於閾值,那麼我們將從線程池中獲取線程並處理它。這種情況下沒有問題 悲傷情況:如果JVM線程數大於閾值,那麼該怎麼辦? 所以我們需要等到jvm線程冷卻下來。如果我們在等待線程,則CPU利用率太高。如果我們繼續等待,那麼記錄過程就會積累起來,並且這將成爲性能方面的問題。 – Man