-2

誰でも次の問題を解決するのを手伝ってもらえますか?

public class Starter extends Thread{
   private int x=2;
   public static void main(String[] args) throws Exception{
      new Starter().makeItSo();
   }
   public Starter(){
      x=5;
      start(); 
   }
   public void makeItSo() throws Exception {
      join();
      x=x-1;
      System.out.println(x);
   }
   public void run(){x*=2;}
}

A.4

B.5

C.8

D.9

E. コンパイルの失敗

F. 実行時に例外がスローされる

G.確実に判断することは不可能です

ダンプでは、答えは D です。new Starter().makeItSo で新しいスレッドが作成されることはわかっています。しかし、run() の x*=2 がメソッド makeItSo の x=x-1 と System.out.println(x) の間で実行される理由を誰か教えてもらえますか?

4

1 に答える 1

1

しかし、run() の x*=2 がメソッド makeItSo の x=x-1 と System.out.println(x) の間で実行される理由を教えてください。

そうではありません。投稿されたコードで何が起こるかの説明は次のとおりです。

1) メイン スレッドは、タイプ Starter の新しいオブジェクトを作成し、そのインスタンス変数 x を最初に 2 に初期化し (変数の初期化)、次に (コンストラクターで) 同じインスタンス変数を 5 に設定し、新しいスレッドを開始します。

2) メイン スレッドはメソッド makeItSo (コンストラクター呼び出しによって作成された Starter インスタンス上) を呼び出し、新しいスレッドに参加し、終了するまで待機します。

3) 新しいスレッドはその run メソッドを実行し、x を 2 倍にして終了します (メインスレッドに終了を通知します)。

4) 次に、メイン スレッドが起動し、x から 1 を引き、9 を出力します。

x はスレッド間で変更され、揮発性でもアトミックでもなく、同期も実行されないため、新しいスレッドによる x への更新がメインスレッドから見えるようになることが保証されているかどうかは明らかではありません (つまり、意図的に動作するのか、事故は不明です)、Gが正解のように見えます。ただし、join は新しいスレッドで同期を行います (join は wait を使用して実装されているため、スレッドをロックします)。x の現在の値は、メイン スレッドが join 呼び出しから戻るまでに表示されます。というわけで、答えはDです。

于 2015-10-22T20:52:20.340 に答える