Java 本机进程超时

2022-08-31 22:20:59

目前,我使用以下方法执行本机进程:

java.lang.Process process = Runtime.getRuntime().exec(command); 
int returnCode = process.waitFor();

假设我希望在经过一定时间后终止,而不是等待程序返回。我该怎么做?


答案 1

所有其他响应都是正确的,但使用 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
}

如果重复执行此操作,线程池会更有效,因为它会缓存线程。


答案 2

如果您使用的是Java 8或更高版本(Android的API 26或更高版本),则只需使用具有超时功能的waitFor

Process p = ...
if(!p.waitFor(1, TimeUnit.MINUTE)) {
    //timeout - kill the process. 
    p.destroy(); // consider using destroyForcibly instead
}

推荐