JavaConcurrencyAPIでを探していると思いThreadPoolExecutor
ます。ここでの考え方は、プール内のスレッドの最大数を定義してから、Runnableで新しいスレッドを開始する代わりに、ThreadPoolExecutor
スレッドの上限の管理を任せるということです。
ここから開始: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番目と4番目の引数は、プールがアイドル状態のスレッドを少なくとも20秒間保持する必要があることを示します。 queue引数は、キューに入れられたタスクを格納するブロッキングキューです。
試してみたいのは、キューのサイズと、拒否されたタスクの処理方法です。10万のタスクを実行する必要がある場合は、10万のタスクを保持できるキューを用意するか、拒否されたタスクを処理するための戦略を立てる必要があります。