2014-02-11 37 views
0

比方說,我有Java應用程序產生並啓動N個線程。我在4核心的Linux或Windows機器上運行它。我會假設,如果我的應用程序創建了一堆線程,那麼在任何時候它們中的4個(或者更多,如果內核使用超線程?)正在同時執行。檢查並控制實際並行運行的應用程序的線程數

  1. 有沒有辦法檢查/驗證它?我知道在Java中你可以打印Runtime.getRuntime().getAvailableProcesses(),但是這個數字是否意味着我的線程數量可以並行運行?我應該看看一些操作系統設置嗎?
  2. 是否有可能,並行性會受OS或JVM設置的限制? (比如說即使你可以一次運行X任務,你的應用程序將被限制爲只有X/2)。

回答

1

例如看看Windows TaskManager(其他操作系統會有類似的工具)。它回答了兩個問題:你可以告訴它顯示每個核心的CPU負載,這樣你就可以看到多少並行運行。您可以右鍵單擊某個進程並告訴操作系統限制該進程的核心使用情況。請注意,在使用Windows 7和Java 7u40的計算機上,使用TaskManager更改處理器時,方法Runtime.availableProcessors()立即反映了更改的處理器數量。

但即使允許進程使用所有內核(默認),如果另一進程同時使用一個或多個內核,它可能會使用更少的內存。這是多任務處理。沒有解決方案,因爲每次嘗試獲取可用內核的實際數量都會因爲該數字可能在下一個納秒內發生變化而變得過時。

沒有必要過度複雜化您的軟件。如果您使用與Runtime.availableProcessors()報告的內核數量相匹配的線程數(還有一些不會受到影響),則您已盡最大努力支持使用所有內核。如果你的應用程序不能使用所有內核,那麼這並不重要,因爲更多線程的開銷可以忽略不計。我們不是在談論數千個線程...

只使用太少可能會導致資源未使用。

相關問題