2009-08-29 3 views
4

他のすべてのスレッドが終了してループが終了するまで、Javaプログラム内のスレッドをループさせたい。ループスレッドが唯一のスレッドであることをいつどのように知ることができますか?スレッドがJavaの唯一の残りのスレッドであるかどうかをどのようにテストできますか?

私の状況では、ループスレッドは他のスレッドへの参照を持たないため、isAlive()が私を助けてくれないと思います。

答えて

11

これは、使用する場合によっては、役立つ場合もあれば、役立たない場合もあります。

はデーモンモード

setDaemon(true); 

にあなたのループのスレッドを設定し、すべての非デーモンスレッドがなくなっている場合は、Javaは、あなたのためにそれを殺すのです。

+0

+1これは彼が探しているものだと思います。 – James

+0

+1もこの解決策が好きです。非常にエレガント。 – Nico

3

これは、Thread Pool Patternと思われる状況ではありませんか?

もしそうでなければ、アクティブなスレッドのリストを維持し、破壊されたものを削除する方がよいでしょうか?

+0

おそらく、それが私を助ける方法を教えてください。 –

+1

ThreadPoolパターンを参照している場合は、そのリンクに移動して、なぜそれを使うのかを読んでください...配列に関しては、明らかではありませんか?各スレッドは、起動時にアレイに追加し、破棄するときに削除します。したがって、あなたはアクティブなスレッドの配列を持っています。したがって、array.count = 1の場合、最後のスレッドがアクティブであることがわかります。 – James

+0

OK、リストを使用します。簿記なしの方法があれば私はまだ興味があります。 –

1

ThreadGroupには、必要な方法があります。同じThreadGroup内のすべてのスレッドを作成できるのが最も簡単ですが、実際には必要ありません。 Thread.currentThread()。getThreadGroup()が起動します。 ThreadGroupのenumerateメソッドは、すべてのスレッドのリストを取得する方法です。

+0

ThreadGroup APIに問題があります。例としてJosh Blochの「Effective Java」を参照してください。問題のページを見るにはGoogle Booksの 'threadgroup effective java'を検索してください。たとえば、Enumerateメソッドは、分かりやすいスレッドセーフではありません(!)。この場合、おそらくいくつのスレッドがあるのか​​知っているでしょうから、ブロッホの配列サイズの問題はおそらく問題ではないでしょうが、それでもなお奇妙なAPIです。 – Cowan

0

ExecutorsとinvokeAllを使用していますか?私。 Callableとして機能を実装できますか?

それから、やり方は簡単です。

0

ThreadFactoryを使用して何かを一緒にハックすることができ、すべてのスレッドを必ずWeakHashMapに登録してください。

マップを繰り返して、どのスレッドが生きているかを確認します。

もう1つのアプローチ - ThreadJMXBeanを使用しますか?

+0

3歳の質問にはなぜ答えていますか?私は2009年に何をしようとしているのか分かりません! :) –

関連する問題