/ /スレッドの完了後にスレッドのrun()メソッドを実行する-java、マルチスレッド、並行性

スレッドの完了後にスレッドのrun()メソッドを実行する - java、マルチスレッド、同時実行性

スレッドの状態を理解しようとしていますスレッドが完了した後のオブジェクト。スレッドが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。もし targetnull そうして Thread.run() メソッドは何もしません。

OK、null以外を指定しました target.

実際、 Thread 仕上げ、 Thread.exit() クリーンアップするためにメソッドが呼び出されます。そして、クリーンアップが行うことの1つは、割り当てることです nulltarget。 (コードには、必要性についてのコメントがあります積極的に参照をクリアし、バグ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);
}