我有一个带有2个进程java的程序:processA和processB(2个进程java.exe而不是2个线程)。
我使用下面来自进程A的代码块来调用processB,此代码包装在下面的RunTask类中

public class RunTask implements Callable<Object> {

private String runParams;

public String getRunParams() {
    return runParams;
}

public void setRunParams(String runParams) {
    this.runParams = runParams;
}

@Override
public Object call() throws Exception {
    try {
        //System.out.println("run:" + runParams);
        Process procB = Runtime.getRuntime().exec("java -jar processB.jar);
        DataInputStream ls_in = new DataInputStream(procB.getInputStream());
        String ls_str;
        while ((ls_str = ls_in.readLine()) != null) {
            System.out.println(ls_str);
        }

    } catch (Exception exp) {
        exp.printStackTrace();
    }
    return null;
}
}

和主类我使用执行器
   ExecutorService eservice = Executors.newSingleThreadExecutor();
        while (1 == 1) {
            String stringParams = getFilesNeedToImportAsString();
            if (stringParams.trim().isEmpty()) {
                long l1 = System.currentTimeMillis() - l;
                System.out.println("all time" + l1 / 1000);
                System.exit(100);
            }
            RunTask runTask = new RunTask();
            runTask.setRunParams(SystemInfo.RUN_COMMAND + stringParams);
            Future<Object> objectFuture = eservice.submit(runTask);
            while (!objectFuture.isDone()) {
                System.out.println("waiting the task running");
                Thread.sleep(500);
            }
        }

但是,当processB上发生异常时,两个进程(processA,processB)似乎都停止了,这是在processB上运行的代码
public Object call() {
    try {
        MutationResult result = mutator.execute();
        return "ok";
    } catch (Exception exp) {
        exp.printStackTrace();
        System.out.println("error on " + Thread.currentThread().getName() + "failed begin retry " + (++retryCount));
        call();
        System.out.println(retryCount + " completed");
        return "ok";
    }

}

如果我单独运行processB(通过命令行),则永远不会发生,或者当发生此问题时,我使用taskmanager杀死proceesA(被调用者),processB继续运行

请任何人给我这个问题的解决方案!

最佳答案

您等待objectFuture isDone方法完成。根据文档:



在发生异常时查看processB中的代码,您将再次递归执行call()。我了解您将其作为错误重试机制进行操作,但这是一个非常糟糕的主意,主要有两个原因:
-如果异常仍然存在,您将最终得到StackOverflowException
-isDone的条件均不满足。

更好的选择是定义最大重试次数,然后尝试执行mutator.execute()。如果错误仍然存​​在,则抛出异常并完成执行。

另一个选择是等待processB完成最长的时间,然后再通过调用objectFuture.cancel(true)取消任务的执行。

关于processA的几点评论:在RunTask上,您不使用runParams,这似乎是一些需要作为字符串导入的文件。另外,您在readLine()上使用了DataInputStream,这是已弃用的方法。而是使用包裹在InputStream中然后包裹在BufferedInputStream中的InputStreamReader(例如BufferedReader)-然后在readLine()上调用BufferedReader

10-08 11:33