【问题标题】:Java ProcessBuilder().start() vs. NodeJS require('child_process').spawn()Java ProcessBuilder().start() 与 NodeJS require('child_process').spawn()
【发布时间】:2019-06-05 01:55:10
【问题描述】:
我们有一个用 NodeJS 编写的遗留应用程序,该应用程序正在使用 require('child_process').spawn() 方法调用 C++ 应用程序。 C++ 应用程序的工作时间约为 5 秒。
然后我将 NodeJS 应用程序转换为 Java,并使用 ProcessBuilder().start() 调用相同的 C++ 应用程序。现在完成应用程序大约需要 30 秒。
您知道可能是什么原因还是这是正常行为? C++ 应用程序创建了一些文件(大约 20 个)。可能是什么原因,我该如何改善?谢谢
【问题讨论】:
标签:
java
node.js
processbuilder
spawn
【解决方案1】:
require('child_process').spawn() 不是同步调用。该方法异步生成子进程,不会阻塞 Node.js 事件循环。
如果你尝试require('child_process').spawnSync(),它将等待 C++ 进程。
所以我认为在 Java 中你需要用一个新线程来运行这个进程。在文档中它说
请注意,这个类是不同步的。如果多个线程访问一个
ProcessBuilder 实例并发,并且至少有一个线程
在结构上修改属性之一,它必须是同步的
外部。
DOC
如果你想异步运行它,你可能需要创建新实例而不是使用单个实例。
Process p = new ProcessBuilder("myCommand", "myArg").start();