子线程中 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(); } }