我可以获得一个Java应用程序来等待后台进程完成吗?

时间:2015-03-14 01:57:23

标签: 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()跟踪它的进度。但我真的不想继续创建临时脚本来调用其他脚本,以便它可以在前台运行。理想情况下,我想按照我今天的方式调用后台进程,并等待它们全部完成。我不知道这是否可能。

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

我认为你可能不会在你的情况下创建一个后台bash命令。 &用于在后台运行命令,这将使实际工作在后台运行,但告诉你shell已完成。

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