gpt4 book ai didi

Java:在线程中启动进程并获取对创建进程的引用

转载 作者:行者123 更新时间:2023-12-02 03:14:28 26 4
gpt4 key购买 nike

我有以下集成测试代码,在测试运行之前我启动了各种服务:

@BeforeClass
public static void setup() throws Exception {

// Set some vars like javaBin location

ProcessBuilder builder = new ProcessBuilder(javaBin, "-jar", "app.jar");
Process process = launchProcess(builder);

}

private static Process launchProcess(ProcessBuilder builder) throws IOException {

AtomicReference<Process> process = new AtomicReference<>();
new Thread(() -> {
try {
process.set(builder.start());

BufferedReader processStd = new BufferedReader(new InputStreamReader(process.get().getInputStream());
BufferedReader processErr = new BufferedReader(new InputStreamReader(process.get().getErrorStream()));

// To prevent deadlocks due to limited buffer size
String s = "";
while(processStd .readLine() != null) {}
while((s = processErr .readLine()) != null) {
System.err.println(s);
}
}
catch (IOException e) {
e.printStackTrace();
}
}).start();

return process.get();
}

进程启动正常,但我 process.get() 总是返回 null。我究竟做错了什么?如何使用上述方法获得对已启动进程的引用?如果我在 setup() 函数本身中设置进程,即 process = builder.start() ,那么它可以正常工作。但是,这也会导致大量重复,因为我需要在单独的 JVM 中启动大量单独的服务。

最佳答案

问题很可能是在您在 launchProcess 末尾使用 process.get() 返回时线程尚未真正启动。

在从方法返回之前,您需要等待线程实际启动并执行对 process.set(builder.start()) 的调用。

这可以通过像 CountDownLatch 这样简单的东西来完成。

private static Process launchProcess(ProcessBuilder builder) throws IOException {
final CountDownLatch latch = new CountDownLatch(1);
// ...
new Thread(() -> {
try {
process.set(builder.start());
latch.countDown();
//...
} catch (IOException e) {
//...
}
}).start();

latch.await();
return process.get();
}

关于Java:在线程中启动进程并获取对创建进程的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40508296/

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