最新のJAVA並行ルーチンを使用したこの特定のケースの例は見つかりませんでした。
threads
0から数千のリクエストを含む可能性のあるオープンキューからのアイテムを処理するために使用する予定です。いつでもキューアイテムを処理するスレッドが0以上、10以下になるように制限したいと思います。
この特定のタイプのケースを対象としたJava並行プロセスはありますか?
最新のJAVA並行ルーチンを使用したこの特定のケースの例は見つかりませんでした。
threads
0から数千のリクエストを含む可能性のあるオープンキューからのアイテムを処理するために使用する予定です。いつでもキューアイテムを処理するスレッドが0以上、10以下になるように制限したいと思います。
この特定のタイプのケースを対象としたJava並行プロセスはありますか?
スレッドプールがあなたが探しているものだと思います。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
これが問題の解決に役立つことを願っています。
私は同じタスクを持っていました:パッケージBlockingQueue
のを使用しました。java.util.concurrent
キューから 1 つのアクションを読み取って処理し、準備ができたら次のアクションを取る X ワーカー スレッドを作成しました。これは簡単で、うまく機能します。
X = 10 個のワーカー スレッドを使用すると、タスクは解決されます。
corePoolSize=0 および maximumPoolSize=10 のスレッド プール エグゼキューターが必要なようです。
http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/ThreadPoolExecutor.html
実際にスレッドの作成にアクセスできず、キューへのアクセスのみを管理する場合、解決策は単純にSemaphore
オブジェクトを使用することです (ドキュメント ページを参照)。
アイデアは、キューにアクセスするのと同じ方法でアクセスされるグローバル セマフォを、数値max_threads
(たとえば 10) に初期化することです。
アイテム処理のためにキューにアクセスする前に、スレッドは最初にセマフォから許可を取得max_threads
します。これは、多数のスレッドがキューからアイテムの処理を既に開始している場合にブロックされます。
アイテムがスレッドによって処理された後、そのスレッドは最終的に許可を解放する必要があります。これにより、より多くのスレッドが他のアイテムを処理できるようになります。
パーミットの取得/解放は、try-finally ブロックを使用して行う必要があることに注意してください。これにより、アイテム処理から何らかの例外がスローされた場合でも、セマフォは一貫した状態のままになります。コードは次のようになります。
semaphore.acquire().
try {
// retrieve item from queue and process it
}
finally {
semaphore.release();
}