2012-11-20 95 views
6

如何限制同時執行的線程數? 這裏是我的算法的示例:Groovy中的線程數量限制

for(i = 0; i < 100000; i++) { 
    Thread.start { 
     // Do some work 
    } 
} 

我想,以確保一旦線程在我的應用程序數量達到100,算法將暫停/等待,直到在應用程序的線程數低於100

目前「一些工作」需要一些時間來完成,並且我的應用程序中只有幾千個線程。最終它耗盡了線程和「一些工作」崩潰。我想通過限制一次可以使用的池的數量來修復它。

請讓我知道如何解決我的問題。

回答

10

我相信你在Java Concurrency API中尋找ThreadPoolExecutor。這裏的想法是,您可以定義池中的最大線程數,然後使用ThreadPoolExecutor負責管理線程的上限,而不是使用Runnable啓動新線程。

從這裏開始:http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/ThreadPoolExecutor.html

import java.util.concurrent.*; 
import java.util.*; 

def queue = new ArrayBlockingQueue<Runnable>(50000) 
def tPool = new ThreadPoolExecutor(5, 500, 20, TimeUnit.SECONDS, queue); 

for(i = 0; i < 5000; i++) { 
    tPool.execute { 
     println "Blah" 
    } 
} 

參數爲ThreadBlockingQueue構造:corePoolSize (5),這是線程#創建,如果系統處於空閒狀態維護,創建線程的maxPoolSize (500)最大數量,第3和第四個參數指出池應該保持空閒線程至少20秒,隊列參數是一個存儲排隊任務的阻塞隊列。

你想要玩的是隊列大小以及如何處理被拒絕的任務。如果你需要執行10萬個任務,你必須有一個可以容納10萬個任務的隊列,或者你必須有一個處理被拒絕任務的策略。

+0

是否有可能得到一個小例子? – MeIr

+0

@梅爾 - 我加了一個例子,你去了。 –

+0

奇怪的是,但上面的例子在Grails中沒有像預期的那樣行爲:(謝謝你的回答,我想我可能要問另一個問題,具體到Grails環境。 – MeIr