Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java,等待子进程退出_Java_Child Process - Fatal编程技术网

Java,等待子进程退出

Java,等待子进程退出,java,child-process,Java,Child Process,使用Java的ProcessBuilder我正在创建一组子进程。我可以使用产生的进程对象中的waitFor()方法等待特定的子对象退出 是否可以以UNIXwait()系统调用的方式阻止,直到任何子项退出?阅读 倒计时锁存器是用 数一数。等待方法块 直到当前计数达到零为止 由于调用倒计时() 方法,之后所有 线程被释放,任何 等待返回的后续调用 马上。这是一次性的 现象——计数不能为空 重置。如果你需要一个版本 重置计数,考虑使用 骑自行车的人 您必须使用某种形式的IPC来实现这一点。如果您被允许

使用Java的
ProcessBuilder
我正在创建一组子进程。我可以使用产生的
进程
对象中的
waitFor()
方法等待特定的子对象退出

是否可以以UNIX
wait()
系统调用的方式阻止,直到任何子项退出?

阅读

倒计时锁存器是用 数一数。等待方法块 直到当前计数达到零为止 由于调用倒计时() 方法,之后所有 线程被释放,任何 等待返回的后续调用 马上。这是一次性的 现象——计数不能为空 重置。如果你需要一个版本 重置计数,考虑使用 骑自行车的人


您必须使用某种形式的IPC来实现这一点。如果您被允许使用本机库,并且在UNIX/Linux平台上工作,请尝试使用相同的wait()系统调用,方法是编写一个简单的JNI包装器&从java代码调用本机方法


如果不能使用本机IPC机制,请使用TCP/IP服务器/客户机机制,在该机制中,当客户机与服务器连接/断开连接时,您可以控制子进程从服务器退出。当没有子连接时,您可以退出服务器程序

第一步是将每个子流程完成的工作表示为,如下所示:

final ProcessBuilder builder = ...;

// for each process you're going to launch
FutureTask task = new FutureTask(new Callable<Integer>() {
  @Override public Integer call() {
    return builder.start().waitFor();
  }
};
现在使用优秀的课程:

ExecutorCompletionService=新的ExecutorCompletionService(executor);
而(!executor.isTerminated()){
Future finishedFuture=service.take();
System.out.println(“返回的精加工过程”+finishedFuture.get());
}
该循环将在每次完成任务时迭代一次。
returnValue
将是子进程的退出代码

现在,您不知道哪个过程已经完成。您可以将Callable改为,而不是返回一个整数,以便只返回进程,或者更好地改为使用自己的类来表示进程的输出


当然,如果你不在乎等待所有的任务,你可以调用
take()
一次。

没有简单的JNI包装器。:)在这里使用JNI的想法似乎很奇怪,也请原谅我的无知,但我不知道“某种形式的IPC”是什么,你的回答没有告诉我什么,甚至一个快速的谷歌也没有帮助。对不起,我不经常投反对票,但我觉得这真的没有什么用处。有没有一本书把它作为一种设计模式来讨论。它似乎与生产者-消费者设计模式非常相似。然而,遗嘱执行人和未来对我来说是新事物。你有没有其他的资料可以阅读。提前谢谢。我发现了一个问题,当我运行
cmd.exe/C start BAT
时,
waitFor()
过早退出,我在cmd命令中添加了一个
/wait
,它按预期工作。;-)
ExecutorService executor = Executors.newCachedThreadPool();
for (FutureTask task : tasks) {
  executor.submit(task);
}

// no more tasks are going to be submitted, this will let the executor clean up its threads
executor.shutdown();
ExecutorCompletionService service = new ExecutorCompletionService(executor);
while (!executor.isTerminated()) {
  Future<Integer> finishedFuture = service.take();
  System.out.println("Finishing process returned " + finishedFuture.get());
}