我正在阅读Effective Java
,在第10章: 并发性; 条款66: 同步访问共享的可变数据中,有一些像这样的代码:
public class StopThread {
private static boolean stopRequested;
public static void main(String[] args) throws InterruptedException {
// TODO Auto-generated method stub
System.out.println(stopRequested);
Thread backgroundThread = new Thread(new Runnable(){
@Override
public void run() {
// TODO Auto-generated method stub
int i = 0;
while (!stopRequested){
i++;
}
System.out.println("done");
}
});
backgroundThread.start();
TimeUnit.SECONDS.sleep(1);
stopRequested = true;
}
}
首先,我认为线程应该运行一秒钟然后停止,因为之后stopRequested
被设置为true
。 然而,程序永远不会停止。 它永远不会打印done
。作者说:
while (!stopRequested)
i++;
将被转换为以下内容:
if (!stopRequested)
while(true)
i++;
请问有人能解释一下这个吗?
还有一个我发现的问题是,如果我将程序更改为以下内容:
public class StopThread {
private static boolean stopRequested;
public static void main(String[] args) throws InterruptedException {
// TODO Auto-generated method stub
System.out.println(stopRequested);
Thread backgroundThread = new Thread(new Runnable(){
@Override
public void run() {
// TODO Auto-generated method stub
int i = 0;
while (!stopRequested){
i++;
System.out.println(i);
}
System.out.println("done");
}
});
backgroundThread.start();
TimeUnit.SECONDS.sleep(1);
stopRequested = true;
}
程序运行了1秒钟并按预期停止。这里有什么不同之处?