【问题标题】:Java multithread vs Shell scriptJava多线程与Shell脚本
【发布时间】:2012-09-28 04:40:59
【问题描述】:

如果我想同时运行 3 个任务,我现在正在考虑两种方法。

由于我是在 linux 中运行程序,所以我可以在 shell 脚本中执行。

  java Task1 &
  java Task2 &
  java Task3 &

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

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

【问题讨论】:

  • 当然,shell 脚本会创建多个 JVM 实例——这就是你告诉它要做的事情。如果您尝试完成的任务是独立的(它们不需要相互通信),那么 shell 脚本是最简单的方法(也是最有意义的方法)。
  • 至于更高效,这取决于您所说的高效 - 更少的内存使用、交换空间、执行时间、磁盘访问、编程时间、安全性等......以及代码的作用
  • 请记住,如果您在一个 JVM 中使用多个线程执行此操作,您将在线程之间共享静态变量等。在不了解您的应用程序的情况下,我不能说这是否会成为问题,但这是您需要考虑的事情。如果你有三个独立的 JVM,那么每个都有自己的静态变量。

标签: java linux multithreading shell jakarta-ee


【解决方案1】:

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

但问题是,您为什么要考虑另一种选择?如果这只是一个小任务,我个人会像你一样在 shell 中启动三个实例。

【讨论】:

  • 编程可能需要更长的时间并且更容易出错,这可能是衡量效率的方式。
【解决方案2】:

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

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

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

但是,我认为纯粹根据处理器效率做出决定并不明智:

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

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

总而言之,如果没有更多的问题细节等,就没有好的明确答案


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

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

【讨论】:

    【解决方案3】:

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

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

    很长一段时间,我指的是每个任务最多 30 秒。那么短期任务呢?在这里,只有经常重复任务时,时间效率才重要。重复运行对(重新)加载 JVM 的开销要小得多,但总有一些会留下来。

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        您现在的做法是启动三个独立的 JVM 实例,每个实例专用于一项任务。如果要在一个 JVM 上同时运行所有三个任务,则需要为它们创建 Thread 对象。

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

        【讨论】:

        • 如果你甚至不知道他到底想做什么,你怎么知道如何解决这个问题?据我们所知,他可以尝试运行 http 服务器和数独客户端。
        • @Cubic 他提出了这两者之间的区别,我试图回答。剩下的就看他自己想办法了。或者,如果他仍不清楚问题,他可以编辑问题或提出新问题。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-02-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-28
        • 1970-01-01
        相关资源
        最近更新 更多