2015-04-26 28 views
0

我希望有一種機制,通過該機制,預期的進程不應運行超過特定時間。特定時間結束後,應顯示進程是否正在運行的狀態,並且進程應該不再運行。特定時間後的殺死進程(Java)

爲此我試圖做兩個類ExecuteCheck,Execute對象的運行方法會執行進程。 Check對象將在特定時間內休眠,然後檢查Execute的對象是否仍在運行。如果它正在運行Check對象有望殺死該線程並打印「是」。否則,Check對象應打印「否」。

class Execute extends Thread{ 
     public void run(){ 
      //Execute process 
     } 
     public static void main(String[] args){ 
      Execute ex = new Execute(); 
      ex.start(); 
      Check ch = new Check(ex); 
      ch.start(); 
     } 
    } 
    class Check extends Thread{ 
     Execute ex; 
     Check(Execute ex){ 
      this.ex = ex; 
     } 
     public void run(){ 
      try{Thread.sleep(5000);} //specific time given is 5 seconds. 
      catch(Exception e){System.out.println(e);} 
      if(ex.isAlive()){ 
      System.out.println("yes"); 
      //kill the thread ex. 
      } 
      else System.out.println("no"); 
     } 
    } 

我的問題是:

  • 我怎麼能殺ex線程?
  • 實現此機制的最佳方法是什麼?
+0

[這個問題]的可能的複製(http://stackoverflow.com/questions/808276/how-to-add-a-timeout-value-when - 使用 - Java類,運行時執行)。 –

+0

閱讀['Process'](http://docs.oracle.com/javase/7/docs/api/java/lang/Process.html),它有一個'destroy()'方法。 – Mordechai

回答

0

在Java中沒有100%安全的方法。

的建議做法是中斷執行線程

if(ex.isAlive()){ 
     System.out.println("yes"); 
     //kill the thread ex. 
     ex.interrupt() 
} 

但是對於工作,你執行run()方法的邏輯裏面,你需要檢查是否interrupted()返回true,如果是這樣,停止計算(例如,如果您的run方法在循環中執行某些操作,則循環內的第一條語句可以執行該檢查。 中斷也會中斷所有「阻塞」操作,如wait(),sleep(),IO操作,因此它會同時影響你的「代碼」,讓我們稱之爲「系統」方法(這就是爲什麼例如睡覺投擲InterruptedException

不過,您需要控制run()方法代碼以添加必要的檢查並停止其執行。

回採線程的鐵桿方式調用

ex.stop() 

,你可以在它已經過時,不應該正常使用的JavaDoc看到,因爲它可能會導致問題(閱讀文檔)。 但它是阻止線程執行代碼的唯一方法,您無法控制。

我的方法是,首先中斷,等待看它是否工作,如果不強行停止線程。

if(ex.isAlive()){ 
     System.out.println("yes"); 
     //kill the thread ex. 
     ex.interrupt(); 
     ex.join(100); //give the ex thread chance to stop in a clean way 
     if (ex.isAlive()) { 
      ex.stop(); 
     } 
} 
0

首先是一些背景資料,我遇到的問題來有超時運行命令,同時,因爲我試圖執行永遠不會打印任何調試或錯誤信息櫃面錯誤的,而且只會繼續重試計劃內部本身導致進程卡住,因爲在重試時從來沒有錯誤或輸出流。

所以process.exec()process.start(),之後

這將是在這一行永遠困,

BufferedReader input = new BufferedReader(newInputStreamReader(process.getInputStream()));

按Java 1.8與public boolean waitFor(long timeout,TimeUnit unit)方法也應該有「理想地」超時指定後超時但在我的情況下,由於某種原因,它從來沒有超時可能是因爲我正在運行應用程序作爲一個Windows服務(我已檢查用戶權限和帳戶上的所有內容,但它沒有幫助)。

所以我試着用下面的邏輯來實現它,在那裏我們會繼續使用input.ready()和一個超時標誌來檢查輸入流。這個簡單的解決方案與所有其他存在的方式相比起到了很大的作用。

見下面的代碼:

https://stackoverflow.com/a/33265110/1212036