我正在寫一個優化算法,創建大約100個線程。目前,我一次啓動它們(for-loop),然後告訴每個線程它應該加入()。Java約100個並行線程,內存管理
我的問題是,現在每個線程使用多少內存,所以堆空間異常不會花費很長時間。我想要某種調度,但不知道如何實現它。
我有這樣的想法:開始10個線程,每次完成其中一個完成一個新的。因此,一次只能運行10個線程,直到沒有線程離開。
有人有想法或知道如何實現這樣的事情嗎?
非常感謝和問候來自科隆
馬爾科
我正在寫一個優化算法,創建大約100個線程。目前,我一次啓動它們(for-loop),然後告訴每個線程它應該加入()。Java約100個並行線程,內存管理
我的問題是,現在每個線程使用多少內存,所以堆空間異常不會花費很長時間。我想要某種調度,但不知道如何實現它。
我有這樣的想法:開始10個線程,每次完成其中一個完成一個新的。因此,一次只能運行10個線程,直到沒有線程離開。
有人有想法或知道如何實現這樣的事情嗎?
非常感謝和問候來自科隆
馬爾科
使用ThreadPoolExecutor用適當的最大池大小。
而是開始一個新的線程來完成新任務的,你有了更好的:
速度和內存的差異是巨大的,因爲您不必爲每個任務啓動和停止線程。
java.util.concurrent包解釋了一切。 一本書會更容易閱讀,雖然:-(
下面是一個例子,讓你開始首先,你需要導入:
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");
}
有關上述的一些注意事項:
java.util.concurrent.atomic
中的課程爲 相當不錯,前提是您需要更新共享狀態 (例如,如果您希望 擁有您已處理多少個任務 的計數器)。
如果您對java和併發感興趣,我強烈推薦這本書:http://www.javaconcurrencyinpractice.com/ – 2010-01-07 10:53:24