2015-04-28 138 views
1

我試圖讓程序運行一些可執行程序(稱爲p),給定時間限制t毫秒。它執行以下任務:從具有時間限制的程序執行程序(Java)

  1. 如果程序p已正常執行,則將其輸出到控制檯。
  2. 如果程序p無法在時間限制內完全執行,請打印"Sorry, needs more time!",然後終止執行p
  3. 如果程序p異常終止(例如RuntimeError),打印"Can I've some debugger?"

我使用ProcessResultReader類在下面的程序從here。我的程序正在工作,只要p完成正常執行或終止異常。但是,如果p本身在timeout之後沒有終止,則它不終止(嘗試p並且沒有退出條件的簡單while(true)循環)。看起來線程stdout即使在執行stdout.stop()後仍然存在。我在這段代碼中做錯了什麼?

謝謝。

import java.util.concurrent.TimeUnit; 
import java.io.*; 

class ProcessResultReader extends Thread 
{ 

    final InputStream is; 
    final StringBuilder sb; 

    ProcessResultReader(final InputStream is) 
    { 
     this.is = is; 
     this.sb = new StringBuilder(); 
    } 
    public void run() 
    { 
     try 
     { 
      final InputStreamReader isr = new InputStreamReader(is); 
      final BufferedReader br = new BufferedReader(isr); 
      String line = null; 
      while ((line = br.readLine()) != null) 
      { 
       this.sb.append(line).append("\n"); 
      } 
     } 
     catch (final IOException ioe) 
     { 
      System.err.println(ioe.getMessage()); 
      throw new RuntimeException(ioe); 
     } 
    } 

    @Override 
    public String toString() 
    { 
     return this.sb.toString(); 
    } 
    public static void main(String[] args) throws Exception 
    { 
     int t = 1000; 
     Process p = Runtime.getRuntime().exec(cmd); //cmd is command to execute program p 
     ProcessResultReader stdout = new ProcessResultReader(p.getInputStream()); 
     stdout.start(); 
     if(!p.waitFor(t, TimeUnit.MILLISECONDS)) 
     { 
      stdout.stop(); 
      p.destroy(); 
      System.out.println("Sorry, needs more time!"); 
     } 
     else 
     { 
      if(p.exitValue()==0) System.out.println(stdout.toString()); 
      else System.out.println("Can I've some debugger?"); 
     } 
    } 
} 
+1

我知道[this](http://stackoverflow.com/a/2733370/1858327)不完全是你要找的,但它似乎可以幫助或至少指出你在正確的方向。 –

回答

0

根據Java文檔, stdout.stop()已被廢棄,甚至stdout.destroy()永遠不會實現。

有關詳細信息,請參閱爲何Thread.stop,Thread.suspend and Thread.resume Deprecated?.

可以轉而嘗試。

String cmd="cmd /c sleep 5"; 
    int timeout = 1; 
    Process p = Runtime.getRuntime().exec(cmd); //cmd is command to execute program p 
    ProcessResultReader stdout = new ProcessResultReader(p.getInputStream()); 
    stdout.start(); 
    if(!p.waitFor(timeout, TimeUnit.MILLISECONDS)) 
    { 
     stdout.stop(); 
     p.destroy(); 
     System.out.println("Sorry, needs more time!"); 
     System.out.flush(); 
    } 
    else 
    { 
     if(p.exitValue()==0) System.out.println(stdout.toString()); 
     else System.out.println("Can I've some debugger?"); 
    } 
+0

我知道'stop()'已棄用。請注意,我想在超時發生時終止執行'p',而不是主要的。否則,我會用'System.exit'。 – user148865