我試圖讓程序運行一些可執行程序(稱爲p
),給定時間限制t
毫秒。它執行以下任務:從具有時間限制的程序執行程序(Java)
- 如果程序
p
已正常執行,則將其輸出到控制檯。 - 如果程序
p
無法在時間限制內完全執行,請打印"Sorry, needs more time!"
,然後終止執行p
。 - 如果程序
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?");
}
}
}
我知道[this](http://stackoverflow.com/a/2733370/1858327)不完全是你要找的,但它似乎可以幫助或至少指出你在正確的方向。 –