2016-04-18 4 views
-2

このコードの出力はどうなるのでしょうか?私はそれをやってみたが、仕事はしなかった。スレッド出力プレーヤー

public static class Player extends Thread { 
    int id; 
    Player op; 

    public Player(int n){ 
     id = n; 
    } 

    public void connect(Player other) { 
     op = other; 
    } 

    public void run() { 
     if(op != null) { 
      try { 
       op.join(); 
      } catch (InterruptedException ex) { 
       System.out.println(" INTERRUPTED"); 
      } 
     } 
     System.out.println("PLAYER ID ="+id); 
    } 

    public static void main(String[] args) { 
     Player p1=new Player(1); 
     Player p2=new Player(2); 
     p1.connect(p2); 
     p1.start(); 
     p2.start(); 
    } 
} 
+0

どうすればうまくいかないのですか?出力を見るためにそれをあなた自身で実行してみませんか? –

答えて

0

まず、静的修飾子は別のクラスの中にネストされていない限り使用できません。したがって、あなたが持っているものはコンパイルされません。静的キーワードを削除して修正すると、プログラムが動作します。

メインスレッドは、p1スレッドとp2スレッドを初期化して開始し、終了します。スレッドはデーモンではないスレッドなので、JVMは完了するまで実行されたままです。

p1スレッドはp2スレッドで結合を呼び出し、p2が終了するまでp1を休止状態にします。 p2のopフィールドはnullに設定されているため、実行され、出力と終了が出力されます(終了時にp1に通知します)。その時点で、p1はp2で待機して目を覚まし、出力を出力して終了します。

したがって、一方のスレッドだけが他方のスレッドで接続を呼び出す限り、接続スレッドはもう一方のスレッドが出力を終了するまで待機します。スレッドを開始する前にp2.connect(p1);行を追加すると、2つのスレッドが互いに永遠に待っているので、デッドロックが発生するはずです。

p1がp2より前に開始することは保証されていません。 p2が実行メソッドを最初に実行した場合、p1はデッドスレッドに参加して待機する必要はありません。どのスレッドが最初に開始されるかに関係なく、結果は同じです(p2が最初に終了します)。

関連する問題