【问题标题】:Wait until called jar execution finished等到调用的jar执行完成
【发布时间】:2017-05-26 19:56:35
【问题描述】:

在我的 Java 程序中,我启动了一个用于修改系统剪贴板内容的外部 .jar 文件。之后,我继续将数据写入剪贴板。不幸的是,看起来 jar 启动了,程序并没有等到 jar 执行完成。

这是我用来启动 jar 文件的代码:

import java.io.IOException;

public class JarExecutor {

    private String pathToJar = "";
    private String jarFile = "";
    private String pathToJava = "C:\\ProgramData\\Oracle\\Java\\javapath\\javaw.exe";

    public JarExecutor(String pathToJar, String jarFile) {
        this.pathToJar = pathToJar;
        this.jarFile = jarFile;
    }

    public void execute() {

        ProcessBuilder pb = new ProcessBuilder(pathToJava, "-jar", pathToJar + jarFile);
        try {
            Process p = pb.start();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}

这是来自主程序:

public static void main(String[] args) {
        String pathToJar = "\\\\some\\net\path";
        String jarFile = "externalProgram.jar";

        JarExecutor myExecutor = new JarExecutor(pathToJar, jarFile)
        myExecutor.execute();

        [...]
}

只要我在我的程序中的myExecutor.execute() 后面加上一个ms > 3000 的Thread.sleep(ms),它就可以工作,但我想这不是等待其他进程完成的正确方法。

【问题讨论】:

  • 你考虑过用 gradle 代替吗?您可以在那里很好地执行外部 java 进程,也可以将自己的代码放在那里。如果这适合您,我可以准备一个带有示例和文档参考的答案。

标签: java


【解决方案1】:

就在Process documentation

waitFor

public abstract int waitFor()
throws InterruptedException

如有必要,使当前线程等待,直到此 Process 对象表示的进程终止。如果子进程已经终止,则此方法立即返回。如果子进程尚未终止,则调用线程将被阻塞,直到子进程退出。

【讨论】:

  • 谢谢 现在完美。我会把你的答案添加到我的问题中
  • @Moka:不要那样做,这不是 SO 的工作方式。您所做的(将答案标记为已接受)就是您在此处的操作方式。很高兴有帮助。
【解决方案2】:

如果您需要在 jar 执行完成后继续使用 main,则使用 waitFor 将是完美的解决方案。否则,您将看到某种进程间通信。尝试使用套接字在进程之间传递消息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-05
    • 1970-01-01
    • 1970-01-01
    • 2015-06-18
    • 2013-09-01
    • 2020-03-11
    • 1970-01-01
    相关资源
    最近更新 更多