Java多线程与Shell脚本

时间:2012-10-07 21:40:09

标签: java linux multithreading shell java-ee

如果我有3个任务我想同时运行所有这些任务,我现在有两种方法。

由于我在linux中运行程序,我可以用shell脚本来完成。

  java Task1 &
  java Task2 &
  java Task3 &

或者,我可以使用一个java程序来生成三个子线程来完成任务。

我想知道哪种方式更有效率。我怀疑shell方式会创建多个JVM实例吗?

5 个答案:

答案 0 :(得分:4)

在Java中执行此操作会更高效,使程序成为多线程并使用三个线程。是的,shell方式将创建三个JVM实例。

但问题是,为什么要考虑另一种替代方案呢?如果这只是一项小任务,我个人只需像你一样在shell中启动三个实例。

答案 1 :(得分:2)

如果任务运行了很长时间,三个JVM的开销可以忽略不计:

  • 由于文件系统缓存,加载时间/磁盘访问不成问题。
  • 共享库内存是Linux内核中的单例。我假设Java使用每线程垃圾收集器,与三个JVM(三个JVM元数据内存除外)相比,为三个线程分配了相同数量的默认内存。
  • 众所周知,Linux在进程调度方面非常有效,使守护进程的独立分支至少与多线程一样高效。在Windows下,我们有一种不同的情况,即流程实例化是一项昂贵的操作。

很长一段时间我指的是每个任务30秒。那么短时间的任务呢?如果任务经常重复,那么时间效率才是重要的。重复运行的(重新)加载JVM的开销要小得多,但总有一些会继续存在。

结论:使用shell脚本更容易实现,编写和维护的代码更少,而且无需编写更多代码即可配置。在运行期间,在一个常见的场景中,您将发现两种方法之间没有太大差异。

答案 2 :(得分:0)

您现在的方式是启动三个单独的JVM实例,每个实例专用于一个任务。如果要在一个JVM上快速运行所有三个任务,则需要为它们创建Thread对象。

因此,我将创建一个非常简单的Java程序,它将在每个线程中启动这些任务。然后我将该程序转换为.jar文件并安排执行。

答案 3 :(得分:0)

越多JVM cpu时间越多。由于一个JVM上的三个Thread会更好。但是进行简单的基准测试是值得的。如果您这样做,请与我们分享。

答案 4 :(得分:0)

  

我想知道哪种方式更有效率。

如果您只是限制决定处理器效率的标准,那么Java线程方法很可能更高效。在JVM启动和内存利用方面运行额外JVM的开销将是可观的。

多线程版本可能较慢的唯一场景涉及某些资源的任务之间的竞争或JVM调优选项的选择不当;例如如果你把堆太小了。

但是,我不认为纯粹基于处理器效率的决定是明智的:

  • 如果任务长时间运行并且您有足够的内存用于3个JVM,则性能差异(以百分比表示)可能无关紧要。 (如果整个运行需要10个小时,谁会关心你是否需要花10秒钟来启动JVM!)

  • 您还需要考虑开发时间,测试和维护。您的思考需要考虑编写健壮的多线程应用程序的潜在复杂性。 (如果没有关于系统功能和非功能性要求的更多细节,我无法预测。)

总之,没有更详细的问题等,没有明确的答案


  

我怀疑shell方式会创建多个JVM实例吗?

错误。它创建多个JVM实例。