使用executorservice来控制运行时进程

我使用一个Runnable对象来运行一个processCommand并执行一些需要一些时间的处理(我们称之为内部处理)。在内部过程结束时,它会将某些内容写入文本文件。这个想法是,如果在某个特定的时间里,内部过程还没有完成,它必须被终止,所以我使用ExecutorService来处理它。但是如果内部过程比指定的时间更早完成,它将中断ExecutorService,以便主线程可以继续执行下一个任务。使用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();

}

}

回答:

老问题,想我会尝试也无妨。

首先,您在双循环中获得ExecutorService,与定义的Runnable在同一个块中。如果您想获得本机执行的返回值"processCommand",然后像您说的那样继续执行下一个任务,那么您需要在循环之前通过实例化它来重用ExecutorService。其次,stoppingTime[i]intFuture.get(...)需要long

以上是 使用executorservice来控制运行时进程 的全部内容, 来源链接: utcz.com/qa/263357.html

回到顶部