私は Java の同時実行に関する大学の授業を行っていますが、最近、1 から 5 までの番号が付けられた 5 つのスレッドを作成し、同期された静的メソッドを使用して各スレッドにそのスレッド番号をクラス内の静的変数に書き込むという簡単なタスクが与えられました。
講師から教えてもらった解決策は次のとおりです。
public class thread1 extends Thread {
private int threadNumber;
private static int threadCount = 0;
private static int value;
public thread1(){
threadNumber = ++threadCount;
System.out.println("Thread " + threadNumber + " is created" );
}
public synchronized static void setValue(int v){
value = v;
try{
Thread.currentThread().sleep(100);
}
catch(InterruptedException e ){}
System.out.println("the current value of the variable is " + value);
}
public void run() {
setValue(threadNumber);
return;
}
public static void main(String[] args) {
for(int i = 0; i < 5; i++){
thread1 thr = new thread1();
thr.start();
}
}
}
出力は次のようになります。
スレッド 1 が作成されます
スレッド 2 が作成されます
スレッド 3 が作成されます
スレッド 4 が作成されます
スレッド 5 が作成されます 変数の現在の値
は 1 変数
の現在の値は 2 変数
の現在の値は 3 変数
の現在の値は 4
変数の現在の値は 5 です
しかし、私が得ている出力は以下のとおりです。
スレッド 1 が作成されます
スレッド 2 が作成されます
スレッド 3 が作成されます
スレッド 4 が作成されます
スレッド 5 が作成されます 変数の現在の値
は 1 です 変数
の現在の値は 5 です 変数の現在の値
は 4 です 変数
の現在の値はは 3
変数の現在の値は 2 です
現在の値の順序は、明らかに毎回異なります。
私が与えられた解決策は間違っていますか?スレッドの各値変数を順番に出力するという意図された目的を達成するために明らかに機能していません。
毎回確実に1から5までの順序でスレッド番号を印刷する方法について、誰かが光を当てることができますか? 同期されたsetValueメソッドを使用するとうまくいくと思いましたが、明らかにそうではありません。