3

最新のJAVA並行ルーチンを使用したこの特定のケースの例は見つかりませんでした。

threads0から数千のリクエストを含む可能性のあるオープンキューからのアイテムを処理するために使用する予定です。いつでもキューアイテムを処理するスレッドが0以上、10以下になるように制限したいと思います。

この特定のタイプのケースを対象としたJava並行プロセスはありますか?

4

4 に答える 4

9

スレッドプールがあなたが探しているものだと思います。ExecutorService と Executors を見てください。

ExecutorService : http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/ExecutorService.html

エグゼキュータ: http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/Executors.html

最大を処理する新しいスレッド固定スレッドプールを取得します。一度に 10 スレッド:

ExecutorService threadPool = Executors.newFixedThreadPool(10);

submit メソッドを使用して、Callable または Runnable をプールに渡します。

ユースケースでは、キューを調べるプロセスが必要です。新しいリクエストがある場合は、Callable または Runnable を作成してスレッドプールに渡す必要があります。プールは最大を保証します。一度に 10 個のスレッドが実行されます。

これは非常に小さなチュートリアルです: http://www.math.uni-hamburg.de/doc/java/tutorial/essential/threads/group.html

スレッド プールを使用する場合の優れた点は、submit メソッドが、実行されたスレッドの戻り値の型をサポートする Future オブジェクトを返すことです。

将来: http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/Future.html

これが問題の解決に役立つことを願っています。

于 2013-02-01T19:08:20.117 に答える
2

私は同じタスクを持っていました:パッケージBlockingQueueのを使用しました。java.util.concurrentキューから 1 つのアクションを読み取って処理し、準備ができたら次のアクションを取る X ワーカー スレッドを作成しました。これは簡単で、うまく機能します。

X = 10 個のワーカー スレッドを使用すると、タスクは解決されます。

于 2013-02-01T19:03:06.790 に答える
1

corePoolSize=0 および maximumPoolSize=10 のスレッド プール エグゼキューターが必要なようです。

http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/ThreadPoolExecutor.html

于 2013-02-01T19:07:06.077 に答える
0

実際にスレッドの作成にアクセスできず、キューへのアクセスのみを管理する場合、解決策は単純にSemaphoreオブジェクトを使用することです (ドキュメント ページを参照)。

アイデアは、キューにアクセスするのと同じ方法でアクセスされるグローバル セマフォを、数値max_threads(たとえば 10) に初期化することです。

アイテム処理のためにキューにアクセスする前に、スレッドは最初にセマフォから許可を取得max_threadsします。これは、多数のスレッドがキューからアイテムの処理を既に開始している場合にブロックされます。

アイテムがスレッドによって処理された後、そのスレッドは最終的に許可を解放する必要があります。これにより、より多くのスレッドが他のアイテムを処理できるようになります。

パーミットの取得/解放は、try-finally ブロックを使用して行う必要があることに注意してください。これにより、アイテム処理から何らかの例外がスローされた場合でも、セマフォは一貫した状態のままになります。コードは次のようになります。

semaphore.acquire().
try {
    // retrieve item from queue and process it
}
finally {
    semaphore.release();
}
于 2013-02-02T01:00:48.493 に答える