看起来布尔值
start正在由另一个线程更新,但是您没有将其声明为
volatile,因此循环永远不会查看更新后的值。
通过添加println来“修复”它只是JVM在为控制台打印机获取本机系统对象时管理线程的堆栈状态的一种方式的后果。解决方法是使启动不稳定并/或在访问它时进行同步。
SCCE:
从不打印:
public class Testit { public static void main(String[] args) { busted t = new busted(); t.start(); try { Thread.sleep(1000L); } catch (Exception e) {} t.startUpdating();} public static class busted extends Thread { private boolean start = false; public void startUpdating() { start = true; } @Override public void run() { updateTimeElapsedIndefinitely(); } public void updateTimeElapsedIndefinitely() { while (true) { if (start) { System.out.println("Hello"); } } } }}更改为1秒钟后开始向您发送垃圾邮件Hello:
private volatile boolean start = false;



