1

大きなメッセージ キューを処理する 4 ~ 5 個のワーカー スレッドがあります。また、2 ~ 3 個のワーカーを使用して実行する別のコードもあります。大きなメッセージ キューが処理されているときに、他のすべてのワーカーをブロックしたかったのです。

私はJDK 6とJmsを使用しています

編集:

キュー プロセス ワーカーが終了しませんでした。メッセージがない場合、キューでブロックされました。これらのワーカーはエグゼキューター スレッド プールによって管理されます。読み書きロックを使用すると、これらのワーカーの 1 つもブロックされます。また、循環バリアを使用する場合は、ブロックしている 2 番目のプロセスを解放するためにスレッドを終了する必要があります。ワーカーはスレッド プールによって管理されるため、すべてのワーカーがメッセージの処理でビジー状態になるとは限りません。

お知らせ下さい、

final ExecutorService executor = getExecutorManager().getExecutor();
for (int i = 0; i < threadPoolSize; i++) {
executor.submit(new MessageWorker(qConn));
}

以下は 2 番目のモジュールです。ここでは、キュー プロセッサのワーカー スレッドが動作している間、すべてのワーカーをブロックします。

final ExecutorService executor = getExecutorManager().getExecutor();
for (int i = 0; i < threadPoolSize; i++) {
executor.submit(new DbUpdateWorker());
}
4

1 に答える 1

1

CyclicBarrierを使用する必要があります。

一連のスレッドが互いに共通のバリア ポイントに到達するのをすべて待機できるようにする同期支援。CyclicBarriers は、相互に時折待機する必要がある固定サイズのスレッドのパーティを含むプログラムで役立ちます。バリアは、待機中のスレッドが解放された後に再利用できるため、サイクリックと呼ばれます。

使用:

CyclicBarrier barrier = new CyclicBarrier(numWorkers, runnable);

ワーカー スレッドが終了したときに呼び出すはどこrunnableにありますか。Runnable各スレッドはbarrier.await()、完了すると呼び出します。

于 2013-04-08T18:49:18.660 に答える