关于Java 线程的一个问题

前几天,在敲到一个代码,碰到如下情况:

        @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