论坛首页 编程语言技术论坛

高手来回答下,这段程序的原理

浏览 1783 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2017-02-24  

public class Test {

    private  static boolean stopRequested;

 

    public static void main(String[] args) throws InterruptedException {

        Thread backgroundThread = new Thread(new Runnable() {

            public void run() {

                int i = 0;

                while (!stopRequested) {

                    i++;

//                    if(i %10000 == 0) System.out.println(stopRequested + " in thread");

                }

            }

        });

 

        backgroundThread.start();

        Thread.sleep(1000);

        stopRequested = true;

        System.out.println(stopRequested);

    }

}

 

这段代码,会一直运行下去。

 

如果把注释的那行打开,就是下面这样,程序一秒后就停止,大神分析下为什么?

public class Test {

    private  static boolean stopRequested;

 

    public static void main(String[] args) throws InterruptedException {

        Thread backgroundThread = new Thread(new Runnable() {

            public void run() {

                int i = 0;

                while (!stopRequested) {

                    i++;

                    if(i %10000 == 0) System.out.println(stopRequested + " in thread");

                }

            }

        });

 

        backgroundThread.start();

        Thread.sleep(1000);

        stopRequested = true;

        System.out.println(stopRequested);

    }

}

   发表时间:2017-02-27  
stopRequested 变量不可见,在主线程中虽然修改了值,但是子线程无法知道此变量的变化 所有程序会一直执行下去,可以改成 private volatile static boolean stopRequested;
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics