【发布时间】:2012-07-26 13:37:18
【问题描述】:
今天我正在使用TimerTask 创建一个超时作业,但遇到了一个新问题,我有一个static volatile boolean 变量flag。我的理解是,一旦此变量的值发生更改,所有正在运行的thread 都会通知它。但是当我运行这个程序时,我得到了以下输出,这是不可接受的。
O/P:
--------------
--------------
DD
BB
Exiting process..
CC
我的期望是我的最后一次打印应该是Exiting process.. 为什么会出现这种奇怪的行为?
我的代码是:
public class TimeOutSort {
static volatile boolean flag = false;
public static void main(String[] args) {
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
flag = true;
System.out.println("Exiting process..");
// System.exit(0);
}
}, 10 * 200);
new Thread(new Runnable() {
@Override
public void run() {
while (!flag)
System.out.println("BB");
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
while (!flag)
System.out.println("CC");
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
while (!flag)
System.out.println("DD");
}
}).start();
}
}
编辑:我怎样才能做到这一点?
【问题讨论】:
-
因为线程执行顺序没有保证!!
-
您是说
volatile不起作用还是您没有正确使用它? ;) -
我不是在谈论排序,我只是好奇我的标志一旦变为真,为什么 while 循环中的语句会被执行?
-
@PeterLawrey,可能是,我能够找出问题所在
-
在编辑得到回答后,您不应该真正修改问题的实质。你要求解释你观察到的行为,你得到了很好的答案;移动球门柱是不公平的。
标签: java multithreading static volatile