2012-03-08 14 views
0

1つのクラスの下に複数のスレッドを書きたいと思っていました。私はここで取得しないこのthreadExampleはどのように機能しますか?

public class ThreadExample { 

    public static void main(String[] arg) 
    { 

     Thread one = new Thread() { 
      public void run() { 
       try { 
        Thread.sleep(2000); 
       } catch(InterruptedException e) { 
        e.printStackTrace(); 
       } 
       System.out.println("One"); 
      } 
     }; 

     Thread two = new Thread() { 
      public void run() { 
       System.out.println("Two"); 
      } 
     }; 

     one.start(); 
     two.start();  
    } 
} 

事は、私はどちらもThreadクラスを拡張していたり​​、私がRunnableインタフェースを実装しています、です。これをどうやって理解するのですか? そして、答えがある場合は、「私はちょうどThreadクラスのオブジェクトを作成し、それを使用していますが、なぜいつもあなたが拡張ある何をしているか、むしろ技術的には?

答えて

2

上記のことをやってよりも、これをしません。Threadあなたが何かをその場でそれを拡張しているが、匿名内部クラスと呼ばれる - hereを開始し、このページに加えて次の二つを読んで、それが何であるかについての詳細を学ぶために

あなたは一時的なインラインサブクラスを作成しているされてこれが何を意味しています。名前がなく、メソッドが終了するまで定義が生き残ります。なぜ、という名前のサブクラスを作成するのではなくまたはRunnableの実装? run()のボディが上記の例と同じくらいシンプルな場合は意味があります。タイピングが少なく、追跡するファイルが少ない場合は.javaです。このような一度だけの簡単なタスクは、匿名の内部クラスの拡張子Threadの候補です。メジャーなプログラムロジックの場合、名前のついたクラス実装を別のファイルで実行したいと思うでしょう。

さらに、Threadの経験を積んだら、java.util.concurrentパッケージをチェックアウトすることをおすすめします。

2

ああ、あなたはです。は、Threadクラスを拡張しています...匿名で。

new Class() {}構文を使用している場合、名前付きクラスのサブクラス(つまり、実際にはextends)であるanonymous classを作成しています。

この場合、Thread.run()メソッドがオーバーライドされています。

このアプローチはうまくいくものの、スレッドを拡張しているにも関わらず "良いデザイン"とはみなされませんが、新しい種類のスレッドは作成していません。コンストラクタにRunnableを渡すために優れている:「私はちょうどThreadクラスのオブジェクトを作成し、それを使用して、なぜいない午前:私はあなたの二番目にお答えしますので、

new Thread(new Runnable() { 
    public void run() { 
     // do something 
    } 
}).start(); 
+0

その情報はすばらしかったです!ありがとう – noMAD

1

ボヘミアンは、あなたの最初の質問に答え上記のことをするのではなく、常にこれを行うのですか?」

あなたが質問したようにいつもやっていたら、タスクを実行するロジックとタスクの実行方法を分けることはできません。 runnableを実装すると、タスクの実行方法を管理するコードとは別に、タスクを実行するロジックをバンドルすることができます。

runnablesを使用する場合は、新しいスレッドでタスクを実行したり、呼び出しスレッドでタスクを実行したり、遅れてタスクを実行したり、実行可能ファイル内のコードを変更することなく他の方法でタスクを実行できます。

スレッドで作業する場合は、一般にスレッドクラスを直接使用する代わりに、ExecutorServiceを使用します。Executorサービスは、スレッド数の制限、失敗した実行の処理、実行可能ファイルの完了時期の決定、他のスレッドで実行されるタスクからの戻り値の取得などの機能を提供します。

+0

ありがとう! :)ポイントを取得します。 – noMAD

関連する問題