【发布时间】:2013-06-12 05:46:22
【问题描述】:
我正在上一门关于 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
每次当前值的顺序明显不同。
我得到的解决方案不正确吗?它显然无法实现其预期目的,即按顺序打印出每个线程的 value 变量。
谁能解释一下我如何让它每次可靠地按从 1 到 5 的顺序打印线程号?我认为使用同步的 setValue 方法可以解决问题,但显然不是。
【问题讨论】:
-
synchronized只是防止多个线程同时进入方法;它没有说明他们输入的顺序。 -
查看 ExecutorService.invokeAll 方法和这里的帖子stackoverflow.com/questions/3741765/…
-
使用join()按顺序获取输出
标签: java multithreading concurrency synchronized