从另一个java进程调用java使其停止

从另一个java进程调用java使其停止,java,multithreading,concurrency,parallel-processing,Java,Multithreading,Concurrency,Parallel Processing,我有一个带有两个进程java的程序:processA和processB(两个进程java.exe而不是两个线程)。 我使用流程A下面的代码块来调用流程B。该代码包装在下面的RunTask类中 public class RunTask implements Callable<Object> { private String runParams; public String getRunParams() { return runParams; } public void s

我有一个带有两个进程java的程序:processA和processB(两个进程java.exe而不是两个线程)。 我使用流程A下面的代码块来调用流程B。该代码包装在下面的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;
}
}
如果我独立运行processB(通过命令行),它永远不会发生,或者当出现此问题时,我使用taskmanager终止proceesA(被调用方),processB将继续运行


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

我在生成exec时遇到的一个问题是,如果发生错误,并且我没有设置线程来读取ErrorStream,那么ErrorStream缓冲区可能会填满,此时一切都会停止,等待我从ErrorStream缓冲区中清除一些文本。在我写之前,进程B不能再写任何错误,进程A正在等待进程B完成


我的经验的最终结果是:在执行()时,始终设置一个线程来读取每个InputStream和ErrorStream

printStackTrace
将打印到标准错误,而不是标准输出。您还需要读取标准错误(这很棘手-需要两个线程,每个流一个),或者打印到标准输出(
printStackTrace(System.out)
)。

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

isDone:如果此任务已完成,则返回true。完成时间可能是由于 正常终止、异常或取消——在所有这些情况下 在任何情况下,此方法都将返回true

当发生异常时,查看processB中的代码,您将再次递归执行
call()
。我知道这是一种错误重试机制,但这是一个非常糟糕的主意,主要原因有两个: -如果异常持续存在,您将得到一个
StackOverflowException
。 -将不满足
isDone
的任何条件

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

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


关于processA:on
RunTask
的几个注释您没有使用
runParams
,它似乎是一些需要作为字符串导入的文件。另外,在
DataInputStream
上使用
readLine()
,这是一种不推荐使用的方法。相反,使用
InputStream
(例如
BufferedInputStream
)包装在
InputStreamReader
中,然后包装在
BufferedReader
中-然后在
BufferedReader
上调用
readLine()
,感谢西班牙人StackOverflower异常可能在这里发生!!我已经修好了:D:D
   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);
            }
        }
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";
    }

}