2016-06-24 5 views
3

ここから私が何を読むからThread join on itself;この方法は、それ自体に呼び出された参加ダンプを通過すると、私はこの質問を得たとき、私は何を思ったことは、メインであることは永遠にスレッドがそれ自身でjoin()を呼び出すとどうなりますか

を待つべきであるため、それは、私が現在ocajp 8認証取得の準備をしています永遠

を待つべき

 public class startinginconstructor extends Thread 
    { 
     private int x=2; 
     startinginconstructor() 
     { 
      start(); 
     } 
     public static void main(String[] args) throws Exception 
     { 
     new startinginconstructor().makeitso(); 
     } 
     public void makeitso() throws Exception 
     { 
      x=x-1; 
      System.out.println(Thread.currentThread().getName()+" about to call join "); 
      join(); 
      System.out.println(Thread.currentThread().getName()+" makeitso completed "); 

      // above line shouldn't be executed (method shouldn't be completed as well)since it joined on itself..? 

     } 
     public void run() 
     { 
    System.out.println(Thread.currentThread().getName()+" run started "); 
     x*=2; 
    System.out.println(Thread.currentThread().getName()+" run about to complete "); 
     } 
    } 

プログラムは、私が間違って永遠に待機しているスレッドの意味を手に入れた出力

main about to call join 
Thread-0 run started 
Thread-0 run about to complete 
main makeitso completed 

次で終わったか何かがあります私は

ノート行方不明です:私は、コンストラクタからスレッドを開始することはお勧めできません知っている..私はただ実際には*ではない、かなり正確な(それを貼り付けたように、これはダンプで正確な質問ですが、私はへのprintln文を配置していますプログラムの流れを参照してください)

答えて

8

あなたの例で自分自身を結合するスレッドはありません。

例のmain()スレッドは新しいスレッドを作成し、新しいスレッドに参加します。

スレッドThread(つまり、Javaオブジェクト)を混同しないでください(コードの実行。)あなたの方法のすべてが同じThreadオブジェクトに属しているが、彼らは二つの異なるスレッドで実行されます。

3

Jamesは正しいです(私の+1)。私はこれをより明示的にしようとしています。次のようになります。

メインスレッドは、startinginconstructorコンストラクタを構築します。

コンストラクタはstartを呼び出し、開始コンストラクタオブジェクトが新しいスレッドのrunメソッドを持つようになります。

その後、メインスレッドはmakeitsoを呼び出します。 makeitsoでは、startinconstructorオブジェクトはthisです。その結果、startinconstructorオブジェクトが表すスレッドが終了するまでメインスレッドが待機することになります。

Javaオブジェクトは、オブジェクトがスレッドを拡張したという理由だけで、どのスレッドからも呼び出せます。そのスレッドでそのメソッドが呼び出されたことを意味しません。

+0

私はそれを理解しています... – viru

関連する問題