从另一个java进程调用java使其停止
我有一个带有两个进程java的程序:processA和processB(两个进程java.exe而不是两个线程)。 我使用流程A下面的代码块来调用流程B。该代码包装在下面的RunTask类中从另一个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
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";
}
}