在 java 規范 17.3 中 睡眠和產量17.3 睡眠和產量Thread.sleep 會導致當前正在執行的線程在指定的持續時間內休眠(暫時停止執行),具體取決于系統計時器和調度程序的精度和準確性。線程不會失去任何監視器的所有權,并且恢復執行將取決于調度和執行線程的處理器的可用性。請務必注意,Thread.sleep 和 Thread.yield 都沒有任何同步語義。特別是,編譯器不必在調用 Thread.sleep 或 Thread.yield 之前將寄存器中緩存的寫操作刷新到共享內存中,編譯器也不必在調用 Thread.sleep 或 Thread.yield 后重新加載寄存器中緩存的值。例如,在下面(斷開的)代碼片段中,假定 this.done 是一個非易失性布爾字段:while (!this.done) Thread.sleep(1000);編譯器可以自由地讀取 this.done 字段一次,并在循環的每次執行中重用緩存的值。這意味著循環永遠不會終止,即使另一個線程更改了 this.done 的值它描述了線程從不重新加載寄存器中緩存的變量,但是當我運行以下代碼時,它不起作用,循環終止public class TestDemo { private static boolean keepRunning = true; public static void main(String[] args) throws Exception { new Thread( ()->{ while (keepRunning){ try { Thread.sleep(1000); } catch (InterruptedException e) { } } System.out.println("loop terminates"); } ).start(); Thread.sleep(1000); keepRunning = false; System.out.println("keepRunning is false now"); }}結果是:java規范17.3中的代碼有一些不同之處?為什么字段 keepRunning 在調用睡眠后重新加載? C:\Users\LuoYY\Desktop>javac TestDemo.java C:\Users\LuoYY\Desktop>java TestDemo keepRunning is false now loop terminates
添加回答
舉報
0/150
提交
取消
