如果我有 3 个任务要同时运行所有这些任务,那么我现在正在考虑两种方法。
由于我在 linux 中运行程序,我可以在 shell 脚本中执行它。
java Task1 & java Task2 & java Task3 &
或者,我可以使用一个 java 程序来生成三个子线程来完成任务。
我想知道哪种方式更有效。我怀疑shell方式会创建多个JVM实例吗?
如果我有 3 个任务要同时运行所有这些任务,那么我现在正在考虑两种方法。
由于我在 linux 中运行程序,我可以在 shell 脚本中执行它。
java Task1 & java Task2 & java Task3 &
或者,我可以使用一个 java 程序来生成三个子线程来完成任务。
我想知道哪种方式更有效。我怀疑shell方式会创建多个JVM实例吗?
在 Java 中执行此操作会更有效,使您的程序多线程并使用三个线程。是的,shell 方式会创建三个 JVM 实例。
但问题是,你为什么要考虑一种选择而不是另一种呢?如果这只是一个小任务,我个人会像你一样在 shell 中启动三个实例。
如果任务运行时间长,三个JVM的开销可以忽略不计:
很长一段时间,我指的是每个任务 30 秒。那么短期任务呢?在这里,只有经常重复任务时,时间效率才重要。重复运行(重新)加载 JVM 的开销要小得多,但总有一些会留下来。
结论:使用 shell 脚本更容易实现,编写和维护的代码更少,可配置性更高,无需编写更多代码。在运行时,在一个常见的场景中,您将观察到两种方法之间没有太大的区别。
您现在的做法是启动三个单独的 JVM 实例,每个实例专用于一项任务。如果要在一个 JVM 上同时运行所有三个任务,则需要为它们创建 Thread 对象。
所以我会创建一个非常简单的 Java 程序,它会在自己的线程中启动这些任务。然后我会将该程序转换为 .jar 文件并安排它执行。
JVM越多,cpu时间越多。由于一个JVM上的三个线程会更好。但值得进行简单的基准测试。如果你这样做,请与我们分享。
我想知道哪种方式更有效。
如果您只是限制您决定处理器效率的标准,那么 Java 线程方法最有可能更高效。在 JVM 启动和内存利用率方面运行额外的 JVM 的开销将是可观的。
多线程版本可能较慢的唯一情况涉及任务之间对某些资源的竞争或 JVM 调优选项的错误选择;例如,如果你让堆太小。
但是,我认为纯粹根据处理器效率做出决定并不明智:
如果任务长时间运行并且您有足够的内存用于 3 个 JVM,则性能差异(以百分比表示)可能微不足道。(如果整个运行需要 10 个小时,谁会在乎你是否需要多花 10 秒来启动 JVM!)
您还需要考虑开发时间、测试和维护。您的想法需要考虑编写强大的多线程应用程序的潜在复杂性。(如果没有更多关于系统功能和非功能要求的详细信息,我无法预测。)
总之,如果没有您的问题的更多细节等,就没有好的明确答案
我怀疑shell方式会创建多个JVM实例吗?
错误的。它将创建多个JVM实例。