当前位置: 首页 > 知识库问答 >
问题:

我可以让Java应用程序等待后台进程完成吗?

都博裕
2023-03-14

我有一个位于服务器上的bash脚本和一个将在该服务器上运行的Java应用程序。我的目标是从Java应用程序调用这个脚本两次,以便两者同时运行。

我有以下代码:

Runtime runtime = Runtime.getRuntime();
Process process = runtime.exec(new String[] { "/bin/bash", "-c", "script.sh & script.sh & " });

这应该通过bash调用脚本,在后台运行它,然后在第一个完成之前立即启动另一个脚本(脚本运行大约需要十秒钟)。这一切似乎都工作得很好。

问题是,然后我想等到两个后台进程都完成后再转到Java程序的下一行。我尝试了这个:

int exitValue = process.waitFor();
// "next line of code"

然而,“下一行代码”似乎是在两个进程真正完成之前运行的。我怀疑现在的情况是,Java认为第二个进程一启动,“进程”就完成了,因为它们都是在后台运行的。我猜就是这个过程。waitFor()只适用于跟踪前台进程

我认为一种解决方案是制作一个临时bash脚本,在后台启动两个进程,在前台运行该脚本,并通过进程跟踪其进度。waitFor()。但我真的不想继续创建调用其他脚本的临时脚本,这样它就可以在前台运行。理想情况下,我希望以今天的方式调用后台进程,并简单地等待它们全部完成。我不知道这是否可能。

共有2个答案

马哲
2023-03-14

我认为你可能不会在你的情况下创建一个背景bash命令。

Runtime runtime =  Runtime.getRuntime(); 
Process process = runtime.exec(new String[] { "/bin/bash", "-c", "script.sh & script.sh " });

刘才俊
2023-03-14

你可以让每个线程在一个子线程中运行,然后“加入”这些线程。

Runnable run1 = new Runnable()
{
    public void run()
    {
        Runtime runtime = Runtime.getRuntime();
        Process process = runtime.exec(new String[] { "/bin/bash", "-c", "script.sh & script.sh & " });
    }
}

Runnable run2 = new Runnable()
{
        Runtime runtime = Runtime.getRuntime();
        Process process = runtime.exec(new String[] { "/bin/bash", "-c", "script2.sh & script2.sh & " });

}

Thread thread1 = new Thread(run1);
Thread thread2 = new Thread(run2);

thread1.start();
thread2.start();

thread1.join();
thread2.join();
 类似资料:
  • 我正在我的UI线程中调用一个方法。在这个方法中创建了一个新线程。我需要UI线程等待这个新线程完成,因为我需要这个线程的结果来继续UI线程中的方法。但我不想让UI在等待时冻结。有没有办法让UI线程在不忙的情况下等待?。

  • 在退出脚本(TCL/Bash)之前,如何确保所有后台进程都已完成执行。 我想把我所有的后台进程PID写到一个pidfile中。然后在最后pgrep PID file,看看在我退出之前是否还有进程在运行。 有什么更简单的方法吗?而TCL有没有具体的办法做到这一点呢?

  • 问题内容: 问题描述 : - 步骤1: 在主线程中从用户那里获取输入FILE_NAME。 步骤2: 对该文件执行10个操作(即,计数字符,计数行等。),所有这10个操作必须位于单独的线程中。这意味着必须有10个子线程。 步骤3: 主线程等待,直到所有那些子线程完成。 步骤4: 打印结果。 我做了什么 :- 我用3个线程做了一个示例代码。 我不希望您遇到文件操作代码。 问题:- 我上面的代码没有给出

  • 问题内容: 我当前正在使用subprocess.call()来调用另一个程序,但是它将阻塞正在执行的线程,直到该程序完成。有没有一种方法可以简单地启动该程序而无需等待返回? 问题答案: 使用代替:

  • 问题内容: 我在Ruby中使用它来循环运行一系列命令行命令。然后,我需要在循环外部运行另一个命令。直到循环中的所有命令都终止后,循环外部的命令才能运行。 我如何使程序等待这种情况发生?目前,最终命令运行得太早。 一个例子: 因此,在运行之前所有需要返回的内容。 问题答案: 我认为您需要将循环内调用的结果分配给变量,并继续调用它们,直到所有变量变为真为止。 然后,您知道所有程序都已完成执行,就可以开

  • 我正在尝试从JavaFX应用程序中创建一个JFrame窗口。我正在使用Oracle Java 8,我能够在Linux,Windows中做我需要的事情,但在Mac OS中却不能。这似乎是一个JVM实现问题。以下是我的要求: 我需要调用一个创建游戏窗口的库方法(JFrame的扩展类)。我需要能够在游戏中使用键盘。 我可以访问库的源代码但无意更改库的源代码 我需要在游戏结束后处理游戏信息,所以我的主线程