
子线程中 while 循环无法中断的原因及其解决方法
本例中,我们创建了一个子线程来修改条件变量 condition 的值为 false,目的是使 run 方法中的 while 循环终止。然而,我们实际观察到 while 循环持续运行,不会打印“退出”信息。
其原因在于 volatile 关键字并不能保证子线程对 condition 的修改在主线程立即可见。当子线程修改 condition 的值时,主线程依然使用该变量的旧值。因此,while 循环仍然以 true 作为条件而持续运行。
要解决这个问题,我们可以将 run 方法本身放到子线程中,确保修改 condition 的操作和 while 循环在同一个线程中执行。修改后的代码如下:
public class VisibilityDemo {
private static volatile boolean condition = true;
public static void main(String[] args) {
new Thread(() -> {
while (condition) {
// do something
System.out.println("...");
}
System.out.println("退出");
}).start();
new Thread(() -> {
condition = false;
}).start();
}
}









