当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不可见?
答案 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
,所有者线程可以强制写入内存并刷新缓存。