共享进程/线程
Share Process / Thread
我遇到了有关进程和线程的问题。我的场景是:
我的 Java 应用程序,将其命名为 'Starter-App',在命名的 Thread
:
Thread startGXThread = new Thread(new Runnable() {
@Override
public void run() {
try {
...
File gxExe = new File(pathToGX); // Path to Diagnosis.exe
gxp = pb.start();
gxp.waitFor();
} catch (IOException e) {
LOG.error("Can't start module");
LOG.error(e.getMessage(), e);
} catch (InterruptedException e) {
LOG.debug("thread interrupted. Destroy process");
LOG.debug(e.getMessage(), e);
if (gxp != null) {
gxp.destroy();
LOG.debug("process exit value: " + gxp.exitValue());
}
}
}
}, "diag_thrd");
之后使用 webapp 启动码头网络服务器 (ServiceWebApp)。
- 启动 Chromium,'Starter-App' 关闭时收听。
一旦 chromium 关闭,'Starter-App' 识别并停止 jetty 并终止 startet 应用程序。Diagnosis.exe。这是通过以下方式完成的:
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run() {
stopAsync();
}
});
public static void stopAsync() {
Thread diag = getThread("diag_thrd");
if (diag != null) {
diag.interrupt();
}
if (gxp != null) {
gxp.destroy();
LOG.debug("process exit value: " + gxp.exitValue());
}
}
问题:
我需要能够从 webapp 中停止 startet Diagnosis.exe 并再次启动它,同时仍然能够 destroy/shutdown Diagnosis.exe 一旦 chromium 在 'Starter-App' 内停止。
我希望我能解释我的问题并希望得到建议。
我认为有一个解决方案,但实施起来很棘手。
您始终可以使用 *nix api 之类的 ps kill #pid
,如此处示例中所述 Killing a process using Java
但是您的网络服务器必须知道要查找哪个 PID。我看到实现这种事情的唯一选择是使用套接字或网络服务。所以你跟踪Diagnosis.exe进程的当前pid是什么,并在杀死之前使用那个ID。
基于 Anands 的回答,我认为您需要在 Diagnosis.exe 和您的 Starter-App 之间使用某种形式的 IPC,使用 websockets 或许多其他选项,以获得一些想法:How to have 2 JVMs talk to one another .
webapp 将向 Starter-App 发送重启请求 Diagnosis.exe,Starter-App 将始终负责管理应用程序三重奏。
我遇到了有关进程和线程的问题。我的场景是:
我的 Java 应用程序,将其命名为 'Starter-App',在命名的
Thread
:Thread startGXThread = new Thread(new Runnable() { @Override public void run() { try { ... File gxExe = new File(pathToGX); // Path to Diagnosis.exe gxp = pb.start(); gxp.waitFor(); } catch (IOException e) { LOG.error("Can't start module"); LOG.error(e.getMessage(), e); } catch (InterruptedException e) { LOG.debug("thread interrupted. Destroy process"); LOG.debug(e.getMessage(), e); if (gxp != null) { gxp.destroy(); LOG.debug("process exit value: " + gxp.exitValue()); } } } }, "diag_thrd");
之后使用 webapp 启动码头网络服务器 (ServiceWebApp)。
- 启动 Chromium,'Starter-App' 关闭时收听。
一旦 chromium 关闭,'Starter-App' 识别并停止 jetty 并终止 startet 应用程序。Diagnosis.exe。这是通过以下方式完成的:
Runtime.getRuntime().addShutdownHook(new Thread() { @Override public void run() { stopAsync(); } }); public static void stopAsync() { Thread diag = getThread("diag_thrd"); if (diag != null) { diag.interrupt(); } if (gxp != null) { gxp.destroy(); LOG.debug("process exit value: " + gxp.exitValue()); } }
问题: 我需要能够从 webapp 中停止 startet Diagnosis.exe 并再次启动它,同时仍然能够 destroy/shutdown Diagnosis.exe 一旦 chromium 在 'Starter-App' 内停止。 我希望我能解释我的问题并希望得到建议。
我认为有一个解决方案,但实施起来很棘手。
您始终可以使用 *nix api 之类的 ps kill #pid
,如此处示例中所述 Killing a process using Java
但是您的网络服务器必须知道要查找哪个 PID。我看到实现这种事情的唯一选择是使用套接字或网络服务。所以你跟踪Diagnosis.exe进程的当前pid是什么,并在杀死之前使用那个ID。
基于 Anands 的回答,我认为您需要在 Diagnosis.exe 和您的 Starter-App 之间使用某种形式的 IPC,使用 websockets 或许多其他选项,以获得一些想法:How to have 2 JVMs talk to one another .
webapp 将向 Starter-App 发送重启请求 Diagnosis.exe,Starter-App 将始终负责管理应用程序三重奏。