6

同時に実行されるスレッドの数を制限するにはどうすればよいですか? ここに私のアルゴリズムのサンプルがあります:

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

アプリケーションのスレッド数が 100 に達すると、アプリのスレッド数が 100 を下回るまでアルゴリズムが一時停止/待機することを確認したいと思います。

現在、「いくつかの作業」には時間がかかり、アプリに数千のスレッドが残っています。最終的にスレッドが不足し、「いくつかの作業」がクラッシュします。一度に使用できるプールの数を制限して修正したいと思います。

私の問題を解決する方法を教えてください。

4

1 に答える 1

10

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万のタスクを保持できるキューを用意するか、拒否されたタスクを処理するための戦略を立てる必要があります。

于 2012-11-20T01:50:43.377 に答える