繁体   English   中英

为什么我们需要Java中的多进程编程?

[英]Why do we need multiprocess programming in Java?

Java支持多线程,Java也支持Process,ProcessBuilder和Runtime.exec()的多进程...

我清楚地知道线程和进程的定义,以及它们在os概念中的区别。

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

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

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

最重要的是,使用processes作为threads补充的原因可能是

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

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

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

JVM中没有失控保护。

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

这取决于,没有简单的答案。 根据操作系统/ JVM,线程和进程可能意味着不同的东西,可能有不同的隔离级别。

为什么有能力同时使用? 这是一个例子

考虑一种情况,您必须使用一些非线程安全的遗留或第三方本机(C ++)库(或不提供保证)。 我想如果你必须简化你的服务器以利用大量的处理器。 多进程架构会更合适。

隔离

  • 如果您尝试使用多线程,则可能会遇到同步,死锁,活动锁等问题。
  • 如果使用多进程体系结构,则可以保证在内存访问方面存在一定程度的隔离。 你能够

错误处理

  • 如果其中一个多进程组件发生故障,您更有可能恢复并可能补偿另一个进程,而不是在启动过程中将整个JVM关闭。 即使有办法处理和保护它,在一个孤立的过程中包装它将使你的生活更轻松。 如果你不得不对一些写得不好的古代外星人本土图书馆进行防御性编码? 你会明白我的意思。

如果您需要运行不适用于JVM但可以使用o / s命令行运行的程序,则不能将其作为线程运行,而只能作为进程运行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM