今天我正在使用以下命令创建一项超时作业TimerTask
但遇到了一个新问题,我有一个static volatile boolean
多变的flag
。我的理解是,一旦这个变量的值发生变化,所有正在运行的都会通知它thread
。但是当我运行这个程序时,我得到了以下输出,这是不可接受的。
O/P:
--------------
--------------
DD
BB
Exiting process..
CC
我的期望是我最后一次打印应该是退出进程..为什么这种奇怪的行为?
我的代码是:
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();
}
}
Edit:我怎样才能做到这一点?
volatile
几乎意味着每次线程访问变量时,它必须确保使用每个线程可见的版本(即没有每线程缓存)。
This doesn't强制 CC 打印线程实际运行立即地之后flag
已设置为true
。一个线程设置标志是完全有可能的(尤其是在单核机器上)and打印消息beforeCC 打印线程甚至有机会运行。
另:请注意打印到System.out
涉及获取锁(在println()
调用),这可以modify测试代码的多线程行为。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)