Java很好地支持多线程,Java也通过Process、ProcessBuilder和Runtime.exec()来支持多进程...
我清楚地知道线程和进程的定义,以及它们在操作系统概念上的区别。
但我想知道为什么以及在什么情况下我们需要在 Java 应用程序中使用多进程而不是多线程?
Java很好地支持多线程,Java也通过Process、ProcessBuilder和Runtime.exec()来支持多进程...
我清楚地知道线程和进程的定义,以及它们在操作系统概念上的区别。
但我想知道为什么以及在什么情况下我们需要在 Java 应用程序中使用多进程而不是多线程?
在我的脑海中,使用processes
作为补充的原因threads
可能是
尽管如此,在大多数应用程序threading
中,由于内存原因、易于生成和(相对)简单易用性,它仍然是首选工具。
不一定将进程视为线程的替代品。java中的进程是执行外部命令的便捷方式。它们在一般并行场景中并没有那么有用,因为它们启动和同步很麻烦。
它们的另一个很好的用途是隔离可能不会终止或导致堆栈溢出的本机代码(或您无法控制的任何其他代码)。如果这要在一个线程内运行,它可能会导致整个过程停止。相反,您可以生成一个新进程,然后强行杀死它,而不必担心太多。
当同步不是问题时,您可能需要它,即不干扰相同数据的进程,但您需要同时收集这些进程的输出,这意味着您需要并行运行它们,尽管它们完全不同过程。
JVM 中没有失控保护。
如果您有一个不会停止的线程,那么强制停止它的唯一方法是让操作系统杀死它的 JVM。通过拥有单独的进程,您可以保持应用程序的其余部分运行。
这取决于,没有简单的答案。根据 OS/JVM,线程和进程可能意味着不同的事物,并且可能具有不同的隔离级别。
为什么有能力同时使用? 这是一个例子
考虑一个场景,当您必须使用一些非线程安全(或不提供保证)的遗留或第三方本机 (C++) 库时。我想如果您必须简化服务器以利用大量处理器。多进程架构会更合适。
隔离
错误处理
如果你需要运行一个不是JVM但可以使用o/s命令行运行的程序,那么你不能将它作为线程运行,而只能作为进程运行。