簡體   English   中英

特定時間后終止進程(Java)

[英]Killing Process after specific time(Java)

我想擁有一種機制,通過該機制,預期過程不應超過特定時間運行。 特定時間結束后,應顯示進程是否正在運行的狀態,並且進程不應再運行。

為此,我嘗試使兩個類分別為ExecuteCheckExecute對象的run方法將執行過程。 Check對象將休眠特定時間,然后檢查Execute對象是否仍在運行。 如果正在運行,則希望Check對象殺死該線程並顯示“ yes”。 否則, Check對象應打印“ no”。

 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線程?
  • 實施此機制的最佳方法是什么?

在Java中,沒有100%安全的方法可以做到這一點。

推薦的方法是中斷Execute線程

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

但是要使其正常工作,您需要在Execute run()方法邏輯中檢查interrupted()返回true,如果是,則停止計算(例如,如果run方法在循環中執行某些操作,則循環中的第一條語句可以進行中斷檢查也會中斷所有“阻塞”操作,如wait(),sleep(),IO操作,因此它會影響您的“代碼”,因此將它們稱為“系統”方法(這就是為什么例如sleep throws 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();
        }
}

首先提供一些背景信息,我遇到了在運行命令時超時的問題,因為我嘗試執行的程序永遠不會在出現錯誤的情況下打印任何調試或錯誤信息,並且會自行繼續在內部重試,從而導致進程卡死因為重試時永遠不會有錯誤或輸出流。

所以在process.exec()process.start()

它會永遠停留在這條線上,

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

按照帶有public boolean waitFor(long timeout,TimeUnit unit)方法的Java 1.8,它應該在指定的超時后“理想地”超時,但由於某些原因,它從未超時,可能是因為我將應用程序作為Windows服務運行(我已經檢查了用戶權限以及該帳戶上的所有內容,但沒有幫助)。

所以我嘗試用下面的邏輯來實現它,我們將繼續使用input.ready()和一個timeout標志來檢查輸入流,這個簡單的解決方案與其他所有解決方案相比都具有吸引力。

請參見下面的代碼:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM