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

标签 java bash process background-process foreground

我有一个位于服务器上的 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就会认为“进程”完成,因为它们都是在后台运行的。我的猜测是 process.waitFor() 实际上只适用于跟踪前台进程。

我认为一种解决方案是制作一个临时 bash 脚本,在后台启动两个进程,在前台运行脚本,并使用 process.waitFor() 跟踪其进度。但我真的不想继续创建调用其他脚本的临时脚本,以便它可以在前台运行。理想情况下,我想像现在这样调用后台进程,然后等待它们全部完成。不知道这是否可行。

最佳答案

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

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();

关于java - 我可以让 Java 应用程序等待后台进程完成吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29044615/

相关文章:

java - 当构造函数初始化参数时从泛型类创建实例

java - JCombobox 无法将多个选项重命名为相同的值

Bash 从长路径中提取文件基名

windows - 进程中的线程数是什么意思(wmic)

c# - 如何使用自定义标识符启动进程/实例

java - 展平 int 数组列表

java - 如何让 Hibernate 4 停止抛出 "Deleting detached instance"?

mysql - 从 XML 文件中获取数据并将其放入 MySQL 数据库

arrays - 将命令输出读入Bash中的数组

bash - 如何等待脚本生成的所有子(和孙子等)进程