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

为什么我们需要Java中的多进程编程?,java,multithreading,multiprocessing,Java,Multithreading,Multiprocessing,Java很好地支持多线程,Java还通过Process、ProcessBuilder和Runtime.exec()支持多进程 我清楚地知道线程和进程的定义,以及它们在操作系统概念上的区别 但是我想知道为什么以及在什么情况下我们需要在Java应用程序中使用多进程而不是多线程?当同步不是问题时,您可能需要它,即进程不干扰相同的数据,但您需要同时收集这些进程的输出,这意味着您需要并行运行它们,尽管它们是完全不同的进程。在我看来,使用进程作为线程的补充的原因可能是 健壮性,一个失败的过程不会影响另一个

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

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


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

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

在我看来,使用
进程作为
线程的补充的原因可能是

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

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

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


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

JVM中没有失控保护


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

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

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

为什么能够同时使用这两种功能???下面是一个示例

考虑这样一个场景:您必须使用一些传统的或第三方的本机(C++)库,这些库不是线程安全的(或不提供任何保证)。我想,如果您必须优化您的服务器以利用大量处理器。多进程体系结构更合适

隔离

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

  • 如果其中一个多进程组件出现故障,您更有可能恢复,并可能使用另一个进程进行补偿,而不是在启动进程中使整个JVM停机。即使有办法处理和防止这种情况,但将其包装在一个单独的过程中会使您的生活更轻松。 如果你曾经不得不对一些写得不好的古代外星人本地库进行代码防御?你会明白我的意思的

线程在进程中运行…具有通读和/或和/或@NandkumarTekale,他可能会这么说,但这种说法通常是不真实的。在
线程
中有很多我不能做的事情,而在
进程
中我可以做的事情,但是我可能会把我的metaphors@NandkumarTekale啊,所以希望,一些链接可能会有所帮助,谢谢你的澄清;)+1对于
通常能够启动外部命令(例如,非java)
我认为您需要详细说明第4点,因为1)您正在谈论进程的优点,但您提到了
线程关联性。2) AFAIK您不能以编程方式设置java进程或线程的关联性(除非您是指对进程使用任务管理器或等效的unix命令?。@Tudor,一些操作系统根本不支持
线程关联性。我也同意这个拙劣的表述。我想让这些要点简短,但不是为了正确性的代价。