設定した数のJava/Groovyスレッドを使用してブロックせずにタスクのプールを実行する方法

今、私はこの一連の作業を実行するためのGroovyコードを持っています:

    CountDownLatch latch = new CountDownLatch(tasks.size);

    for( task in tasks ) {
        Thread.start worker.curry(task, latch)
    }

    latch.await(300L, TimeUnit.SECONDS);

同時スレッドの数を特定の数 t に制限したいと思います。 n タスク、 n スレッドのために今作成された方法は「一度に」作成されます。私は複数のラッチや何らかのコールバックを使用することを考えましたが、良い解決策は思い付きませんでした。

実行中のスレッドが t に達するか、実行されていないタスクがなくなるまで、スレッドの実行が t 以下になるとすぐに、新しいタスクスレッドを開始する必要があります。

2

2 答え

GPars をチェックし、リストされた抽象概念の1つを使用する必要があります。その後、withPool()で作成する番号を指定することができます。私はフォーク/ジョインが好きです:

withPool(4) { pool ->
  runForkJoin(rootTask) { task ->
    task.eachTask { forkChild(task) }
  }
}
5
追加された

Executorフレームワークを使用できます。

Executors.newFixedThreadPool(t);

これにより、開始時にn個のスレッドとn個のスレッドしか作成されません。次に、これらのスレッドを利用するために実行者に提出することができます。

編集:コメントジョシュのおかげで、私はあなたのソリューションを投稿します

ExecutorService pool = Executors.newFixedThreadPool(6); 
for( task in tasks ) { 
    pool.execute Worker.curry(task)
} 
pool.shutdown();
4
追加された
これは私のために働いた。レコードの場合、コードは ExecutorService pool = Executors.newFixedThreadPool(6)です。 for(タスクのタスク){pool.execute Worker.curry(task)} pool.shutdown();
追加された 著者 Josh Diehl,