簡體   English   中英

流程不會終止

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM