我正在上一门关于 Java 并发的大学课程,最近得到了一个简单的任务,即创建 5 个编号从 1 到 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方法可以解决问题,但显然不是。