当前位置: 首页 > 面试题库 >

Java运行异步进程

东方淇
2023-03-14
问题内容

我试图运行一个异步进程,但我不希望程序等到这些进程执行结束。我发现了这个问题,如何从Java程序中异步运行shell脚本,但是它没有我想要的答案。

我正在做的只是运行bash进程,而在运行bash进程后,我不希望Java程序等到完成为止。这是我所做的:

public void runCommandLine(String directory) throws IOException {
    Thread commandLineThread = new Thread(() -> {
        try {
            ProcessBuilder processBuilder = new ProcessBuilder(
                    "/bin/bash");
            processBuilder.directory(new File(directory));
            Process process = processBuilder.start();
            try (OutputStreamWriter osw = new OutputStreamWriter(process.getOutputStream())) {
                osw.write(command);
            }
            printStream(process.getErrorStream(), true);
            printStream(process.getInputStream(), true);
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    });
    commandLineThread.start();
    System.out.println("Task Dispatched");
}

我还在main方法的末尾放出了另一张印刷品,因此得到以下输出:

Task Dispatched
Task Dispatched
End of psvm

但是,程序不会终止,因为这两个进程尚未终止。

我该如何解决这个问题?


问题答案:

您需要使您的线程成为守护线程。setDaemon(true)启动前使用。

 commandLineThread.setDaemon(true);

守护程序线程是不会阻止JVM退出的线程。看到以下问题:Java中的Daemon线程是什么?有关守护程序线程的更多信息。

编辑:

通过注释判断,即使JVM即将退出,您也需要运行该命令。我假设command变量包含您要运行的脚本?您可以进行两项更改,以使程序按我认为的方式运行。

  1. 从bash开始-c执行命令,然后不必将东西发送到输出流。
  2. 在启动等待输出的线程之前,先启动进程。

结果代码如下所示:

public void runCommandLine(String directory) throws IOException {
    ProcessBuilder processBuilder = new ProcessBuilder(
                    "/bin/bash -c " + command);
    processBuilder.directory(new File(directory));
    Process process = processBuilder.start();
    Thread commandLineThread = new Thread(() -> {
        try {
            printStream(process.getErrorStream(), true);
            printStream(process.getInputStream(), true);
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    });
    commandLineThread.setDaemon(true);
    commandLineThread.start();
    System.out.println("Task Dispatched");
}


 类似资料:
  • 问题内容: 我尝试运行一个异步进程。基于以下示例:http : //tomee.apache.org/examples-trunk/async- methods/README.html 但是,只有在完全完成其中的代码后,该方法才会返回。 然后当它返回并被调用时,我将得到异常: 原因:java.lang.IllegalStateException:对象不代表实际的Future 有什么建议我想念的吗?

  • 问题内容: 在我们的Web应用程序中,用户可以进行需要大量数据库表进行更新的更改。所有内容的加载时间最长为30秒。我不希望用户在导航到另一个页面之前等待其完成。 我将长时间运行的代码放在自己的页面上(例如,“ updateinfo.aspx”),并尝试了一些解决方案,包括jQuery AJAX调用“ updateinfo.aspx”或加载调用“ updateinfo.aspx”的图像文件。在所有情

  • 如何在将GUI保持为活动状态而不是Hibernate/等待状态的同时延迟进程或创建队列?

  • 问题内容: 我在一个比较大的Web应用程序上工作,后端主要使用PHP。代码中有几个地方需要完成一些任务,但是我不想让用户等待结果。例如,在创建新帐户时,我需要向他们发送欢迎电子邮件。但是,当他们按下“完成注册”按钮时,我不想让他们等到实际发送电子邮件之后,我只想开始该过程,并立即向用户返回一条消息。 到目前为止,在某些地方,我一直在使用exec()感觉像是被黑客入侵。基本上是这样的: 这似乎可行,

  • 然而,在我下面的代码中,我希望在这两个示例中都花费相同的15秒(每个任务5秒),如本文所述。然而,第二个示例只需要5秒,同时运行所有3个示例也需要5秒来完成第二个示例。原来的文章花了5秒,但我把它改成了1秒的延迟,让它更明显。 有没有人能解释一下这是怎么回事,为什么它看起来像线程一样运行?

  • 我正在尝试用Jasmine和RequireJS做一些测试。一切都进行得很好,直到我注意到我所描述的函数的上下文出现了问题。 有人知道怎么解决这个吗?