分享流程/线程

时间:2016-12-20 09:15:06

标签: java multithreading process processbuilder

我遇到了有关Process和Threads的问题。我的情景是:

  • 我的Java应用程序,称之为'Starter-App',在名为ProcessBuilder的{​​{1}}内启动另一个带有Thread的exe应用程序(Diagnosis.exe):

    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启动jetty webserver(ServiceWebApp)。

  • 启动chrome和'Starter-App'在关闭时收听。
  • 一旦铬关闭'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并再次启动它,同时仍然能够在“Starter-App”中停止Chrome后销毁/关闭Diagnosis.exe。 我希望我能解释我的问题并希望得到建议。

2 个答案:

答案 0 :(得分:2)

在Anands回答的基础上,我认为您需要在Diagnosis.exe和Starter-App之间使用某种形式的IPC,使用websockets或许多其他选项来表达某些想法:How to have 2 JVMs talk to one another

webapp会向Starter-App发送重新启动Diagnosis.exe的请求,Starter-App将始终负责管理应用程序三人组。

答案 1 :(得分:1)

我认为有一个解决方案,但实施起来却很棘手。

您可以随时使用* {iix api',如ps kill #pid中所示Killing a process using Java

但您的网络服务器必须知道要查找哪个PID。我看到实现这种事情的唯一选择是使用套接字或Web服务。因此,您要跟踪Diagnosis.exe进程的当前pid是什么,并在杀死之前使用该ID。