【问题标题】:Why do we need multiprocess programming in Java?为什么我们需要在 Java 中进行多进程编程?
【发布时间】:2012-09-09 09:07:14
【问题描述】:

Java很好地支持多线程,Java也通过Process、ProcessBuilder和Runtime.exec()支持多进程...

我很清楚线程和进程的定义,以及它们在操作系统概念上的区别。

但我想知道为什么以及在什么情况下我们需要在 Java 应用程序中使用多进程而不是多线程?

【问题讨论】:

  • 线程在进程中运行...阅读Thread vs Processes和/或Wiki和/或Processes and Threads
  • @NandkumarTekale 他可能会这么说,但这种说法通常是不真实的。在Thread 中有很多我不能在Process 中做的事情,但我可能混合了我的隐喻
  • @NandkumarTekale 啊,所以希望一些链接可能会有所帮助,感谢您的澄清;)

标签: java multithreading multiprocessing


【解决方案1】:

当同步不是问题时,您可能需要它,即不干扰相同数据的进程,但您需要同时收集这些进程的输出,这意味着您需要并行运行它们,尽管它们是完全不同的过程。

【讨论】:

    【解决方案2】:

    在我看来,使用processes 作为threads 的补充的原因可能是

    • 稳健性,一个失败的进程不会影响另一个进程
    • 分离。启动多个 JVM 允许运行相同的类而无需担心干扰(例如,更易于使用的非线程安全库)
    • 通常能够启动外部命令(例如,非 java)
    • 线程亲和性。在某些操作系统中,它可能通过多个 CPU 而不是线程共享的进程提供更好的缓存语义,尤其是在考虑线程共享工作集时。

    尽管如此,在大多数应用程序中,threading 是出于内存原因的首选工具,易于生成且(相对)简单易用。

    【讨论】:

    • Generally to be able to launch external commands (e.g., non-java)+1
    • 我认为您需要详细说明第 4 点,因为 1) 您在谈论流程的优势,但您提到了Thread affinity。 2) AFAIK,您不能以编程方式设置 java 进程或线程的亲和性(除非您的意思是使用任务管理器或等效的 unix 命令来处理进程?)。
    • @Tudor,有些操作系统根本不支持Thread Affinity。我也同意糟糕的表述。我想保持简短,但不是为了正确性。
    【解决方案3】:

    不一定要将进程视为线程的替代品。 java中的进程是执行外部命令的便捷方式。它们在一般并行场景中并没有那么有用,因为它们启动和同步很麻烦。

    它们的另一个很好的用途是隔离可能不会终止或导致堆栈溢出的本机代码(或任何其他您无法控制的代码)。如果这要在一个线程中运行,它可能会导致整个过程停止。相反,您可以生成一个新进程,然后强行杀死它,而不必担心太多。

    【讨论】:

      【解决方案4】:

      JVM 中没有失控保护。

      如果你有一个不会停止的线程,强制停止它的唯一方法是让操作系统杀死它的 JVM。通过拥有单独的进程,您可以保持应用程序的其余部分运行。

      【讨论】:

        【解决方案5】:

        如果你需要运行一个不是JVM但可以使用o/s命令行运行的程序,那么你不能将它作为线程运行,而只能作为进程运行。

        【讨论】:

          【解决方案6】:

          这取决于,没有简单的答案。根据 OS/JVM,线程和进程可能意味着不同的事物,并且可能具有不同的隔离级别。

          为什么可以同时使用两者? 这是一个例子

          假设您必须使用一些非线程安全(或不提供任何保证)的遗留或第三方原生 (C++) 库。我想如果您必须简化服务器以利用大量处理器。多进程架构会更合适。

          隔离

          • 如果您尝试使用多线程,您可能会遇到同步、死锁、活动锁等问题。
          • 如果您使用多进程架构,则可以保证内存访问方面的某种程度的隔离。你可以

          错误处理

          • 如果其中一个多进程组件发生故障,您更有可能恢复并可能用另一个进程进行补偿,而不是在启动进程中关闭整个 JVM。尽管有办法处理和防止这种情况,但将其包装在一个独立的过程中会让你的生活更轻松。 如果你曾经不得不针对一些写得很糟糕的古代外星人本地库进行防御性编码?你会明白我的意思。

          【讨论】:

            猜你喜欢
            • 2021-07-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-08-26
            • 1970-01-01
            • 2020-02-21
            相关资源
            最近更新 更多