2012-04-26 7 views
0

可能性の重複:実行可能スレッドを拡張して独自のカスタムオブジェクトを作成し、スレッドを使用してスレッドを作成する間にいくつかの微妙な違いは、(私は思ったんだけど
Java: “implements Runnable” vs. “extends Thread”新しいスレッド(Runnable runnableObj)対。拡張スレッド

あり)コンストラクタ?

スレッドを拡張するクラスを使用するとうまくいくいくつかのコードがありますが、Thread(Runnable)コンストラクタを使ってスレッドを作成するロジックを使用しようとすると、新しいスレッドが正しく動作しないようです - 私が作成したカスタムサブクラスを使用したときと同じ方法でそれらが生きていることを検出し、それらは永遠に終わらないように見えます。

私のコードでは、いくつかのスレッドを作成してスレッドのリストを検索して、生きているものを見つけ、死ぬまでそれに参加しています。それから私はもう一度、生きているリストの中のスレッドを検索します。これはすべてのスレッドが死ぬまで続きます。

読んでいただきありがとうございます。

+0

これは重複していますが、独自の質問にするためにコードを表示(およびタイトルを変更)することもできます。 – Gray

答えて

2

スレッドは作業を行うためのリソースです。 Runnableは仕事の一部です。新しいタイプのリソースを作成しているのか、完了した作業だけを定義していますか?

スレッドを「終了」するには、単に「実行」メソッドから戻るだけです。彼らが活動しているかどうかを知ることができないということを知るためには、コードの例を見る必要があります。

Runnablesを作成することで、将来的にThreadPoolを使用するようにコードをリファクタリングすることも容易になります。

2

私のコードでは、私はちょうどいくつかのスレッドを生成し、次にスレッドのリストを検索して、生きているものを見つけ、死ぬまでそれに参加しています。

「スレッドのリストを検索する」方法(そしてなぜ)ですか?私の代わりにあなたがして、その後全体で反復処理し、順番に各Threadに参加することができますCollectionのいくつかの並べ替えにThreadを追加します。

List<Thread> threads = new ArrayList<Thread(); 
    for (int i = 0; i < 100; i++) { 
    Thread thread = new Thread(new Runnable() ...); 
    thread.start(); 
    threads.add(thread); 
    } 
    ... 
    for (Thread thread : threads) { 
     thread.join(); 
    } 

さらに良いことにはExecutorsによって与えられたExecutorService Sのいずれかを使用することであろう。彼らは、スレッドプールの作成とプールが完全に終了するのを待つという点で、多くの機能を備えています。ほとんどの場合、new Thread(...)以上が推奨されます。

私はカスタムサブクラスを使用するとき、私は

を作ったとして、あなたはあなたができる、その後Threadの名前を設定しようとしている場合、それらは同じように生きていることを検出することはできませんRunnableのコンストラクタでこれを行いません。 ですが、run()メソッドでこれを実行してください。あなたが行うことができます:それはすでに終了している場合を除き、あなたのThreadを見られない理由

new Thread(new Runnable() { 
     public void run() { 
      Thread.currentThread().setName("..."); 
     } 
    }); 

をそれ以外の場合、私はわかりません。

これまでに終了していないようです。 Runnable、スレッドの終了を使用

場合run()メソッド戻り - return又はthrow介してのいずれか。これは、Threadを拡張するのと非常に同じですので、なぜこれが機能しないのか分かりません。

1

私は本当にconcurrency utilityを使用し、スレッドを管理しようとしないでください。複雑でエラーが発生しやすいです。 並行APIを使用すると、適切なパターンをすぐに適用するのにも役立ちます。

関連する問題