2010-01-07 23 views
9

我正在寫一個優化算法,創建大約100個線程。目前,我一次啓動它們(for-loop),然後告訴每個線程它應該加入()。Java約100個並行線程,內存管理

我的問題是,現在每個線程使用多少內存,所以堆空間異常不會花費很長時間。我想要某種調度,但不知道如何實現它。

我有這樣的想法:開始10個線程,每次完成其中一個完成一個新的。因此,一次只能運行10個線程,直到沒有線程離開。

有人有想法或知道如何實現這樣的事情嗎?

非常感謝和問候來自科隆

馬爾科

+3

如果您對java和併發感興趣,我強烈推薦這本書:http://www.javaconcurrencyinpractice.com/ – 2010-01-07 10:53:24

回答

1

考慮您將要使用的機器中的內核數量。如果您通常運行的線程數等於核心數,性能將最好。正如KLE所說,使用線程池。

+0

我目前運行2,因爲它是來自Intel的Core2Duo。性能看起來不錯...... – Marco 2010-01-08 09:52:18

+4

如果你完全受CPU限制,這可能是真的,但如果有任何阻塞操作(例如,IO,睡眠,某些類型的鎖定),那麼你通常需要比內核更多的線程來保持核心充分利用。 – mikera 2011-01-20 02:30:19

2

而是開始一個新的線程來完成新任務的,你有了更好的:

  • 具有的任務隊列來執行(而不是線程來運行)
  • 使用較小線程池(如邁克爾提到的)來處理這些任務

速度和內存的差異是巨大的,因爲您不必爲每個任務啓動和停止線程。

java.util.concurrent包解釋了一切。 一本書會更容易閱讀,雖然:-(

4

下面是一個例子,讓你開始首先,你需要導入:

import java.util.concurrent.ExecutorService; 
import java.util.concurrent.Executors; 
import java.util.concurrent.TimeUnit; 

然後你需要把裏面的東西方法:

ExecutorService pool = Executors.newFixedThreadPool(10); 
    for(final Task task: tasks) { 
     pool.execute(new Runnable() { 
      @Override 
      public void run() { 
       task.execute(); 
      } 
     }); 
    } 
    pool.shutdown(); 
    while(!pool.awaitTermination(1, TimeUnit.SECONDS)) { 
     System.out.println("Waiting for tasks to shutdown"); 
    } 

有關上述的一些注意事項:

  • 你需要實現自己的01真正實現Task類 你的算法
  • 任務類不只是 有一個執行方法(事實上,如果 它有簽名,你可以只 讓你的任務是實現Runnable 和避免匿名內部類)
  • 您需要確保 您使用的所有內容都正確 已同步。 java.util.concurrent.atomic中的課程爲 相當不錯,前提是您需要更新共享狀態 (例如,如果您希望 擁有您已處理多少個任務 的計數器)。
  • 您通常只需要儘可能多的 線程執行,因爲您的機器上有核心 /cpus。經常 性能經常上升,當 線程數量下降。 通常情況下,如果 您的任務花費了大量時間 阻止,您只能使用更多的線程。