我使用一個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();
}
}
您應該始終使用本機進程的標準輸出流和錯誤流。看看這裏http://www.javaworld.com/jw-12-2000/jw-1229-traps.html – Svilen
@Svilen這是一篇很棒的文章。 – Andreas