2013-08-26 118 views
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循環不會終止。我非常感謝一些幫助。也許我忽略了一些明顯的東西。

在此先感謝。

回答

1

您正在嘗試使用interrupted在線程之間進行通信,但尚未告知編譯器,因此它僅通過檢查一次來「簡化」您的循環。製造interruptedvolatile

+0

啊......輝煌。非常有意義。非常感謝 –

+0

因此,if語句的條件總是被重新評估,而while語句的條件不是。 –

+0

@ MadsBoyd-Madsen這不一定是真的。在C語言中,這種情況出現在優化級別上,AFAIK JLS不會禁止優化它。通過使用普通變量在線程之間進行通信,您只是遇到未定義的行爲。 – chrylis