0
我正在編寫一個控制檯應用程序,它可能會運行數天和數天。爲了讓我的電腦有一段時間可以這麼說,我需要這個應用程序是可以中斷的,但這樣做只會在執行期間的某些明確定義的點上停止。Interruptable Java控制檯應用程序
我決定使用一個信號處理程序來捕獲CTRL + C,但它的行爲方式讓我無法擺脫困境。
我要的是這樣的:
public static void main(String[] args)
{
class MySignalHandler implements SignalHandler
{
boolean interrupted = false;
public void handle(Signal signal)
{
interrupted = true;
}
}
MySignalHandler env = new MySignalHandler();
Signal.handle(new Signal("INT"), env);
while (! env.interrupted)
{
... Carry out a small and well-defined portion of the overall process ...
}
}
這不工作(至少不是從我的Windows命令提示符)。該應用程序永遠不會終止。
但是,如果我改變while循環看起來像這樣:
while (true)
if (env.interrupted)
System.out.print("Y");
else
System.out.print("N");
...並運行在命令提示符下,我得到以下效果的應用: NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN(現在我按CTRL + C)YYYYYYYYYYYYYYYYYYYYYYYYYYY
顯然信號被代碼困住了,所以我不明白爲什麼原始的while循環不會終止。我非常感謝一些幫助。也許我忽略了一些明顯的東西。
在此先感謝。
啊......輝煌。非常有意義。非常感謝 –
因此,if語句的條件總是被重新評估,而while語句的條件不是。 –
@ MadsBoyd-Madsen這不一定是真的。在C語言中,這種情況出現在優化級別上,AFAIK JLS不會禁止優化它。通過使用普通變量在線程之間進行通信,您只是遇到未定義的行爲。 – chrylis