私は2つのプロセスjava:processAとprocessB(2つのスレッドではなく2つのプロセス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;
}
}
およびメインクラス私はexecutorを使用します
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は実行を継続します。
誰かが私にこの問題の解決策を教えてください!