条件满足时,while循环不会终止

时间:2018-08-01 11:08:07

标签: java while-loop core

据我了解,以下代码应在满足stopRunning = true;的条件下正常终止。

但是,当我运行该程序时,它仅打印Last line of Main(),而while循环从未终止,因此从未打印过Start Method ended

 public class Test {
     private static boolean stopRunning = false;
     public static void main(String[] args) throws Exception {
        new Thread(new Runnable() {

            @Override
            public void run() {
                start();
            }

        }).start();

        Thread.sleep(100);
        stopRunning = true;
        System.out.println("Last line of Main()");
    }
    public static void start() {
        while (!stopRunning) {

        }
        System.out.println("Start Method ended.");
    }
}

请帮助我了解这种行为。

3 个答案:

答案 0 :(得分:1)

使用

将标志更改为volatile

private static volatile boolean stopRunning = false;

表示其他线程(从主内存而不是从缓存中)立即看到更改 ,并且代码按预期执行。 volatile如何与Java的内存模型相关联,例如,在this tutorial中。

答案 1 :(得分:0)

如Mick所述,您应该使用volatile关键字来同步变量,以便在更改时将新值直接写回到内存中,并且代码将按预期工作。

请注意(在Mick链接的文章中也有提及),volatile不能保证避免出现竞争情况,因此,如果两个不同的线程将读取您的变量,则它们都读取相同的值(尽管读取了所有内容)是不安全的从内存中读取并直接写回更改)

答案 2 :(得分:0)

如先前的回答所述:

  1. 就像Mike所说的那样-在run()中,您应该使用Test.start()或重命名该方法。您正在调用的start是线程的start方法。
  2. 也正如Mick所说,将stopRunning设置为volatile应该会有所帮助。之所以起作用,是因为它将删除线程内存中变量的缓存,并将直接从内存中获取/设置。