2012-08-06 51 views
1

是否真的不希望創建10個以上的附加線程? 示例:Java多線程(10或更多?)

for(int i=0; i<100; i++) { 
    new Thread() { 
     public void run() { 
      // something 
     } 
    }.start(); 
} 

將創建並啓動100個線程。那不好,對吧?

更新>每個線程正在下載東西,把它放入包

+5

答案所依賴的關鍵部分是您對「不良」的定義。 – dasblinkenlight 2012-08-06 13:38:34

+0

有時候這是可取的。例如,我在其中一個應用程序中創建了超過50個線程來存檔最大的CPU利用率和性能。 – gkuzmin 2012-08-06 13:39:01

+1

這取決於你想要做什麼.. – 2012-08-06 13:39:15

回答

6

創建比您需要的更多線程是不可取的。

當然,如果你需要100個線程,那麼這是一個很好的數字來創建。

不知道從哪裏得到it is undesirable to create more than 10 additional threads。 Java進程可以處理10,000個線程。

+0

我認爲java進程可以處理多個10,000線程,我不認爲這取決於java進程http://stackoverflow.com/questions/763579/how-many-threads-can-a-java-vm-support – 2012-08-06 14:01:37

+0

我發現即使進程限制爲300K,Java進程也會得到大約32K的限制。 10,000的數量是它經常被認爲值得嘗試減少你擁有的線程數量的地方(或者使用更多的機器) – 2012-08-06 14:03:47

+1

@PeterLawrey哈哈 - 上次我試圖看看我會在哪裏創建OutOfMemoryException來創建太多的線程,我在Windows 7 +硬重新啓動時出現了黑屏;-) – assylias 2012-08-06 20:53:22

1

完全取決於上下文。如果大多數你正在做的工作是cpu綁定,那麼除非你實際上有100個內核,否則可能不會造成太大的變化,或者實際上會讓事情變得更糟(上下文切換等)。如果I/O任務耗費大量時間,那麼線程化可能是有益的。你真的需要做一些基準測試。

2

如果您使用10個線程的線程池並將正確的Runnable傳遞給它們,它會更容易和更快。

+0

這個問題沒有通用的答案。這實際上取決於可運行程序的功能 - 如果他們將大部分時間用於阻塞,只有10個線程的效率會非常低。如果他們繼續運行計算,10個線程可能是一個合理的賭注,但即使在這種情況下,答案顯然取決於該機器的處理器數量... – assylias 2012-08-06 20:55:01

+0

我完全同意,但我沒有添加我的答案的更多細節 – Dimitri 2012-08-07 12:35:29

1

你可能想要的是一個ThreadPool而不是創建這麼多的線程。

例如:

ExecutorService executor = Executors.newFixedThreadPool(4); 
executor.submit(YourRunnable); 

看起來更進線程池 - 他們會讓你的生活更輕鬆。

+0

Ahaaha = D謝謝!真! – ruslanys 2012-08-06 15:06:06

+1

@ruslanys對不起,試圖幫助;) – Eugene 2012-08-06 15:07:55

+0

真的謝謝你。非常有用的建議。 – ruslanys 2012-08-06 17:14:30