スレッドの状態を理解しようとしていますスレッドが完了した後のオブジェクト。スレッドがrun()メソッドを完了すると、スレッドオブジェクトは引き続きヘッド上で有効なオブジェクトであり、インスタンスオブジェクトとして使用でき、メソッドを呼び出すことができるという本を読みました。次の例でこれを試すことにしました。
class DieThread implements Runnable{
int y = 0;
public void run(){
for(int x=0; x<100; x++){
System.out.println(" " + Thread.currentThread().getName());
System.out.println("y is " + y);
y++;
System.out.println("y is " + y);
}
}
}
class ZiggyTest2{
public static void main(String[] args){
DieThread d = new DieThread();
Thread a = new Thread(d);
Thread b = new Thread(d);
Thread c = new Thread(d);
a.start();
b.start();
c.start();
try{
a.join();
b.join();
c.join();
}catch(Exception e){
System.out.println(e);
}
System.out.println("Running C"s Run");
c.run();
}
}
main()は、他の3つのスレッドが完了するのを待ちますjoin()を使用します。次に、cのrun()メソッドを呼び出しますが、何らかの理由でrun()メソッドから何も出力されません。上記のプログラムを実行した後の出力の最後の数行を次に示します。
y is 287
y is 287
y is 288
y is 289
Thread-1
Thread-0
y is 289
y is 289
y is 290
y is 291
Thread-1
Thread-0
y is 291
y is 291
y is 292
y is 293
Thread-1
Thread-0
y is 293
y is 293
y is 294
y is 295
Thread-0
y is 295
y is 296
Thread-0
y is 296
y is 297
Thread-0
y is 297
y is 298
Thread-0
y is 298
y is 299
Thread-0
y is 299
y is 300
Running C"s Run
スレッドが完了したとしても、c.run()呼び出しのため、yの値は400になると予想していました。
何か案は?
ありがとう
回答:
回答№1は1あなたが観察している理由は、の実装に埋もれています Thread
クラス。
あなたが電話するとき c.run()
あなたが呼んでいる run
スレッドオブジェクトのメソッド。これは、 run
の方法 target
オブジェクト(つまり、で提供されるランナブル Thread
コンストラクター)そうでない場合 null
。もし target
は null
そうして Thread.run()
メソッドは何もしません。
OK、null以外を指定しました target
.
実際、 Thread
仕上げ、 Thread.exit()
クリーンアップするためにメソッドが呼び出されます。そして、クリーンアップが行うことの1つは、割り当てることです null
に target
。 (コードには、必要性についてのコメントがあります積極的に参照をクリアし、バグID。残念ながら、対応するバグレポートが欠落しているため、これを行う本当の理由を知ることはできません。)
とにかく、肝心なのは、「ターゲットオブジェクトを再実行することはできない」ということです。 run()
呼び出してメソッド Thread.run()
。ただし、ターゲットオブジェクトを呼び出すことはできます run()
直接メソッド...ターゲット参照がある場合。
回答№2の場合は3
Threadクラスを拡張すると、機能します。これで、 Runnable
であるターゲット null
Thread.exit()の後
回答№3の場合は1
オブジェクトの状態へのアクセスを同期します DieThread
synchronized(this) {
System.out.println(" " + Thread.currentThread().getName());
System.out.println("y is " + y);
y++;
System.out.println("y is " + y);
}