Java 本机进程超时
目前,我使用以下方法执行本机进程:
java.lang.Process process = Runtime.getRuntime().exec(command);
int returnCode = process.waitFor();
假设我希望在经过一定时间后终止,而不是等待程序返回。我该怎么做?
目前,我使用以下方法执行本机进程:
java.lang.Process process = Runtime.getRuntime().exec(command);
int returnCode = process.waitFor();
假设我希望在经过一定时间后终止,而不是等待程序返回。我该怎么做?
所有其他响应都是正确的,但使用 FutureTask 可以使其更加健壮和高效。
例如
private static final ExecutorService THREAD_POOL
= Executors.newCachedThreadPool();
private static <T> T timedCall(Callable<T> c, long timeout, TimeUnit timeUnit)
throws InterruptedException, ExecutionException, TimeoutException
{
FutureTask<T> task = new FutureTask<T>(c);
THREAD_POOL.execute(task);
return task.get(timeout, timeUnit);
}
final java.lang.Process[] process = new Process[1];
try {
int returnCode = timedCall(new Callable<Integer>() {
public Integer call() throws Exception {
process[0] = Runtime.getRuntime().exec(command);
return process[0].waitFor();
}
}, timeout, TimeUnit.SECONDS);
} catch (TimeoutException e) {
process[0].destroy();
// Handle timeout here
}
如果重复执行此操作,线程池会更有效,因为它会缓存线程。
如果您使用的是Java 8或更高版本(Android的API 26或更高版本),则只需使用具有超时功能的waitFor:
Process p = ...
if(!p.waitFor(1, TimeUnit.MINUTE)) {
//timeout - kill the process.
p.destroy(); // consider using destroyForcibly instead
}