关于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();
                }
        }
}


1个回答

根本原因不是这行的代码的问题,而是你的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
alickr
alickr 虽然不是这行的代码的问题,但也没你说的这么简单吧,你把run里面的flag = false;也注释掉看看,同样无法进那个if
4 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐