前几天,在敲到一个代码,碰到如下情况:
@Override
public void run()
{
while(true)
{
// 注释句在此 System.out.println(flag);
if (flag)
{
System.out.println("flag is true");
// 当标识位为true时,执行到这里,转为false
flag = false;
}
}
}
情况是,我在外部改变flag的值,每隔0.5秒就在外部将flag设置为true。结果这段代码中注释句去掉注释的话,会有"flag is true"的输出,但是注释加上的话,就永远不会输出"flag is true"
有谁可以给出个合理解释吗?
全部代码如下:
class MyThread extends Thread
{
// 设置标识位
private boolean flag = false;
public void setFlag()
{
flag = true;
}
// 线程执行
@Override
public void run()
{
while(true)
{
// System.out.println(flag);
if (flag)
{
System.out.println("flag is true");
// 当标识位为true时,执行到这里,转为false
flag = false;
}
}
}
public static void main(String[] args)
{
MyThread t = new MyThread();
t.start();
// 每隔0.5秒设置标识位为true
while (true)
{
try{
Thread.sleep(500);
} catch (InterruptedException e)
{}
t.setFlag();
}
}
}
根本原因不是这行的代码的问题,而是你的run代码中while(true)循环的太频繁了,而flag变动时间确实间隔500ms的。
所以是频率上来讲,注释掉的这行每次打印flag的时候都可能为false,所以需要改下Thread的run的方法,也sleep一段时间就能看到交替打印的情况了。
public void run() {
while (true) {
System.out.println(flag);
if (flag) {
System.out.println("flag is true");
// 当标识位为true时,执行到这里,转为false
flag = false;
}
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
打印结果为:
false
true
flag is true
true
flag is true
true
flag is true
false
flag is true
false
flag is true
false
flag is true