我使用 Runnable 对象来运行 processCommand 并执行一些需要一些时间的处理(我们称之为进程内)。在 insideprocess 结束时,它会将一些内容写入文本文件。这个想法是,如果在某个指定的时间内,insideprocess 仍然没有完成,它必须被杀死,所以我使用 ExecutorService 来处理它。但是如果 insideprocess 比指定的时间早完成,它会中断 ExecutorService 以便主线程可以继续下一个任务。
但问题是,有时,内部进程根本不创建文件,或者它创建了一个文件,但里面没有任何内容。当内部进程早于指定时间完成时,就会发生这种情况。我不知道我的实施有什么问题。请注意,如果我手动执行该过程(不使用 ExecutorService),则该过程运行良好并且它可以正确写入所有内容。
在这里,我发布我的代码来完成这项工作:
public void process(){
for (int i = 0; i < stoppingTime.length; i++) {
for (int j = 2 * i; j < 2 * (i + 1); j++) {
final int temp = j;
ExecutorService executor = Executors.newSingleThreadExecutor();
Runnable r = new Runnable() {
@Override
public void run() {
Process p = null;
int ex = 1;
try {
p = Runtime.getRuntime().exec(
processCommand.get(temp));
while (ex != 0) {
try {
//sleep every 30 second then check the exitValue
Thread.sleep(30000);
} catch (InterruptedException e) {
}
ex = p.exitValue();
p.destroy();
}
} catch (IOException e) {
e.printStackTrace();
System.out.println("IOException");
}
}
};
Future future = executor.submit(r);
try {
System.out.println("Started..");
future.get(stoppingTime[i], TimeUnit.SECONDS);
System.out.println("Finished!");
} catch (TimeoutException e) {
System.out.println("Terminated!");
} catch (InterruptedException e) {
System.out.println("Future gets InterruptedException");
} catch (ExecutionException e) {
System.out.println("Future gets ExecutionException");
}
executor.shutdownNow();
System.out.println("shutdown executor");
}
System.out.println();
}
}