将运行标志设置为false后,为什么线程继续运行?

时间:2019-06-21 03:53:04

标签: java synchronization

当flag为true时,我有一个线程在运行,但是当我将flag更改为false时,它不会死。

public static void main(String[] args)
    {
        try
        {
            MyThread mt = new MyThread();
            mt.start();
            Thread.sleep(1000);
            mt.setRunning(false);
            System.out.println("set running false");
        }
        catch (InterruptedException e)
        {
            e.printStackTrace();
        }
    }

    public static class MyThread extends Thread
    {
        private boolean isRunning = true;

        public boolean isRunning()
        {
            return isRunning;
        }

        public void setRunning(boolean isRunning)
        {
            this.isRunning = isRunning;
        }

        public void run()
        {
            System.out.println("run");
            while (isRunning == true){
            }
            System.out.println("run over!");
        }
    }

我知道将“ isRunning”定义为volatile将解决问题,但是当不是volatile时,“ isRunning”在某个时刻对MyThread不可见?

2 个答案:

答案 0 :(得分:3)

这是由于可见性原因。

使变量可变:

    try
        do shell script "kextstat|grep -y appleintel >/tmp/Intel.txt" with administrator privileges

        on error  
        display alert "blabla..."

    end try
end showIntel:```

有关更多详细信息,请参见What is the volatile keyword useful for

  

我知道将“ isRunning”定义为volatile将解决问题,但是   当不是易失性时,“ isRunning”在某些时候应该不可见   MyThread?

volatile private boolean isRunning = true; 线程更改它时,需要使isRunning可见的MyThread的值更改。否则,它可能只会继续看到main的缓存值。

答案 1 :(得分:0)

这里有两个线程。每个线程都有一个缓存。当您不添加volatile时,线程将从所有者缓存中读取值。因此,myThread.isRunning是正确的。通过使用volatile,所有者线程可以强制写入内存并刷新缓存。