[英]Processes don't terminate
我正在使用Java Executors.newWorkStealingPool();
用於並行運行多個命令。 由於其中一些任務可能會超時,因此我為它們添加了2秒的超時。
ProcessBuilder pb = new ProcessBuilder(cmd.split(" "));
Process p = null;
StringBuilder result = new StringBuilder();
try {
p = pb.start();
p.waitFor(2000, TimeUnit.MILLISECONDS);
BufferedReader errreader =
new BufferedReader(new InputStreamReader(p.getErrorStream()));
BufferedReader outreader = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line = "";
while ((line = outreader.readLine())!= null)
result.append(line + "\n");
while ((line = errreader.readLine())!= null)
result.append(line + "\n");
outreader.close();
errreader.close();
} catch (InterruptedException e) {
result.append("INTERRUPTED");
} catch (IOException e) {
e.printStackTrace();
System.exit(-1);
}
finally {
p.destroy();
}
....
return b; // b is boolean
提交任務看起來像這樣
List<ImmutablePair> curJobs = new ArrayList<ImmutablePair>();
for (int i = 0; i < allMutants.size(); i++) {
String mutant = allMutants.get(i);
t = executor.submit(new mutTask(mutant));
ImmutablePair pair = new ImmutablePair(mutant, t);
curJobs.add(pair);
}
最后。 我在以下循環中收集結果。
// data collection loop
for (int i = 0; i< curJobs.size(); i++) {
ImmutablePair p = curJobs.get(i);
String m= (String) p.getLeft();
System.out.println(m);
t = (Future<Boolean>) p.getRight();
try {
boolean res;
try {
res = t.get(2000L, TimeUnit.MILLISECONDS);
} catch (TimeoutException e) {
res = true;
}
finally {
t.cancel(true);
}}
問題在於,超時似乎並未終止程序中定義的某些命令或進程。 幾分鍾后,數據收集循環變得非常緩慢。 ps
的結果顯示一些作業在指定的超時時間內運行得很好,並使CPU繁忙。 我的配置是CentOS上的JDK8。
正如@MadProgrammer指出的那樣,問題在於在進程終止的情況下讀出/錯誤緩沖區。 為了解決這個問題,您需要檢查p.waitFor(2000, TimeUnit.MILLISECONDS);
的輸出p.waitFor(2000, TimeUnit.MILLISECONDS);
try {
p = pb.start();
boolean timeout = !p.waitFor(2000, TimeUnit.MILLISECONDS);
if (!timeout){
BufferedReader errreader =
new BufferedReader(new InputStreamReader(p.getErrorStream()));
BufferedReader outreader =
new BufferedReader(new InputStreamReader(p.getInputStream()));
String line = "";
while ((line = outreader.readLine())!= null)
result.append(line + "\n");
while ((line = errreader.readLine())!= null)
result.append(line + "\n");
outreader.close();
errreader.close();
}
} catch ...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.