2015-12-01 26 views
0

我使用EXEC()啓動VLC在Java中的exec()執行的程序:如何知道用戶關閉在Java

Process process = Runtime.getRuntime().exec("/usr/bin/vlc -"); 

我怎麼能知道什麼時候被關閉VLC窗口? 我知道exitValue()返回進程的退出值。如果進程尚未完成,它將返回IllegalThreadStateException。 所以我想我可以有一個try/catch的while循環來檢查exitValue()是否拋出一個異常,如果沒有,這意味着這個過程已經完成。但這似乎是CPU時間的浪費。

回答

2

您可以使用Process.waitFor()等待執行的過程完成。

參見:

http://docs.oracle.com/javase/7/docs/api/java/lang/Process.html#waitFor%28%29

+0

但不waitFor()停止當前的線程,直到過程完成?我不想阻止線程 – gfields

+1

您必須在單獨的線程中啓動您的進程。當這個新線程終止時(例如run()方法結束),它可以向主線程拋出一個事件,通知它該過程已經完成。 – Marcinek

+0

謝謝。我會嘗試。 – gfields

3

可以使用waitFor()方法您Process對象(https://docs.oracle.com/javase/8/docs/api/java/lang/Process.html#waitFor--

Process process = Runtime.getRuntime().exec("/usr/bin/vlc -"); 
int exitCode; 
try { 
    exitCode = process.waitFor(); 
} catch(InterruptedException e) { 
} 

的這會讓你的當前線程等待進程結束(不忙等待= CPU友好),或直到它中斷。

+0

謝謝,但事情是,我不想停止當前的線程。 – gfields

+0

對不起,但你的問題暗示這就是你想要的。你的while循環的例子也可以做到。正如另一條評論所指出的,你總是可以啓動另一個線程來完成這項工作。如果你有更具體的要求,你將不得不相應地改變你的問題。 – DevCybran

+0

問題用waitFor()解決。我在主線程中啓動了VLC,並在其中啓動了一個帶有waitFor()的新線程,然後是當VLC關閉時我要執行的代碼。感謝您的幫助。 – gfields

相關問題