我试图运行一个异步进程,但我不希望程序等到这些进程执行结束。我发现了这个问题,如何从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
变量包含您要运行的脚本?您可以进行两项更改,以使程序按我认为的方式运行。
-c
执行命令,然后不必将东西发送到输出流。结果代码如下所示:
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做一些测试。一切都进行得很好,直到我注意到我所描述的函数的上下文出现了问题。 有人知道怎么解决这个吗?