gpt4 book ai didi

java - 让父线程等待子线程完成或超时

转载 作者:行者123 更新时间:2023-11-30 06:37:35 24 4
gpt4 key购买 nike

我在 unix 上运行一个 Java 进程。

我需要运行一个由主进程使用 ProcessBuilder 生成的外部进程。主进程等待外部进程完成,然后生成下一个外部进程。我已经让它工作到这里了。

<p></p>

<p>public static void main(String[] args) {
for(...) {
int exitVal = runExternalProcess(args);
if(exitVal !=0) {
failedProcess.add(args);
}
}
}</p>

<p>private int runExternalProcess(String[] args) {
ProcessBuilder pb = new ProcessBuilder(args[0], args[1], args[2]);
pb.redirectErrorStream(true);
Process proc = pb.start();
BufferedReader br = new BufferedReader(new InputStreamReader(
proc.getInputStream()));
String line = null;
while ( (line = br.readLine()) != null)
LOG.log(Level.SEVERE, line);</p>

<pre><code>//Main thread waits for external process to complete.
//What I need to do is.
// If proc.executionTime() > TIMEOUT
// kill proc;
int exitVal = proc.waitFor();

proc.getInputStream().close();
proc.getOutputStream().close();
proc.getErrorStream().close();

return exitVal;
</code></pre>

<p>}</p>

<p></p>

我无法弄清楚的是,如何做到这一点。对于某些输入,外部进程挂起,在这种情况下,我想等待一个设置的超时时间,如果到那时外部进程还没有完成,就杀死它并将控制权返回给主进程(连同退出值,以便我可以跟踪失败的进程),以便可以启动下一个外部进程。

我尝试使用 proc.wait(TIMEOUT) 然后使用 proc.exitValue();获取退出值,但无法使其正常工作。

谢谢!

最佳答案

您可以执行 Thread.join(long) 或 Thread.join(long, int) 并在单独的线程中启动进程。

添加一些代码。 (有效但未针对所有极端情况进行全面测试)

  public class Test {

public static void main(String[] args) throws Throwable {
for(int i = 0; i < 3; i++) {
ProcessRunner pr = new ProcessRunner(args);
pr.start();
// wait for 100 ms
pr.join(100);
// process still going on? kill it!
if(!pr.isDone()) {
System.err.println("Destroying process " + pr);
pr.abort();
}
}
}

static class ProcessRunner extends Thread {
ProcessBuilder b;
Process p;
boolean done = false;

ProcessRunner(String[] args) {
super("ProcessRunner " + args); // got lazy here :D
b = new ProcessBuilder(args);
}

public void run() {
try {
p = b.start();

// Do your buffered reader and readline stuff here

// wait for the process to complete
p.waitFor();
}catch(Exception e) {
System.err.println(e.getMessage());
}finally {
// some cleanup code
done = true;
}
}

int exitValue() throws IllegalStateException {
if(p != null) {
return p.exitValue();
}
throw new IllegalStateException("Process not started yet");
}

boolean isDone() {
return done;
}

void abort() {
if(! isDone()) {
// do some cleanup first
p.destroy();
}
}
}
}

关于java - 让父线程等待子线程完成或超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3292540/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com