1

私にはいくつかの開発が必要であり、使用する設計パターンがあるかどうかを確認しようとしています。問題は簡単です:

多くのトレッドを起動するメインスレッドがあります。メイン スレッドは、各スレッドが終了するのを待ってから、別の処理を行う必要があります。既存のコードは少し醜いです。スレッド グループをチェックして何かが実行されているかどうかを確認する while ループがあります。

//launch threads
.....
//wait for threads to finish
while (ThreadRepository.getInstance().isActiveThreadGroup(myGroupId)) {
    Thread.sleep(5000);
}

//doing something else

ご覧のとおり、while ループは実行中のスレッドがなくなるまで実行を続けます。

私は生産者と消費者のパターンで考えていましたが、そのようなことをしたいと思います:

たとえば、いくつかの BlockingQueue を使用し、各スレッドがそれに何かを入れます (または取ります)。myQueue.take()whileとsleepの代わりに、キューが空になるのを待つ何かが欲しい です。空の場合、スレッドが実行されていないことを意味します。

インターネットで検索しようとしましたが、自分の問題に一致するものが見つかりませんでした。

私の問題を解決するのに最も効率的な方法を知っている人はいますか?

4

2 に答える 2

2

N 個のスレッドが終了するまで 1 つのスレッドを待機させる簡単な方法が 2 つあります。

  1. メインスレッドが他のすべてのスレッドで join() を呼び出すようにします。join() は、スレッドが終了するか、すでに終了したときに戻ります
  2. N に初期化された CountDownLatch を作成し、このラッチをすべてのスレッドに渡し、countDown()終了時に各スレッドがラッチで呼び出しを行い、メイン スレッドawait()がラッチで呼び出しを行います。この 2 番目の手法は、最初の手法よりも少し難しいですが、より柔軟で再利用可能であり、N 個のスレッドがまだ終了していない場合でも、ある程度の遅延後に目覚めることができます。
于 2012-04-19T08:54:26.017 に答える
0

次のように BlockingQueue を使用できます。

  • 各子スレッドは、終了時にメッセージをキューに入れます

  • メイン スレッドはキューからメッセージを取得し、それらをカウントします。メッセージの数がスレッドの数と同じになると、すべてのスレッドが終了します。

于 2012-04-19T09:25:42.403 に答える