何时在Java中选择多个线程进程?

时间:2012-02-18 07:35:26

标签: java multithreading concurrency

出于什么原因,人们会选择多个线程上的几个进程来实现Java中的应用程序?

我正在重构一个旧的java应用程序,该应用程序目前分为几个在同一个多核机器上运行的较小的应用程序(进程),通过套接字相互通信。

我个人认为应该使用线程而不是进程来完成,但是哪些参数可以保护原始设计?

2 个答案:

答案 0 :(得分:9)

我(和其他人,见下面的归因)可以想到几个原因:

历史原因

  • 设计是从只有绿色线程可用的日子开始,而原作者/设计师认为他们不适合他。

稳健性和容错性

  • 您使用非线程安全的组件,因此您无法通过多个进程进行并行化。

  • 某些组件存在问题,您不希望它们影响多个进程。比如说,如果组件有内存或资源泄漏,最终可能会强制进程重启,那么只有使用该组件的进程才会受到影响。

  • 正确的多线程仍然很难做到。取决于您的设计比多处理更难。然而,后者可能也不容易。

  • 您可以拥有一个模型,其中有一个监视程序进程可以主动监视(并最终重新启动)崩溃的工作进程。这可能还包括暂停/恢复进程,这对于线程来说是不安全的(感谢@Jayan指出)。

操作系统资源限制&治

  • 如果使用单个线程的进程已经在使用所有可用的地址空间(例如,对于Windows 2GB上的32位应用程序),则可能需要在进程间分配工作。

  • 通常只能在每个进程的基础上限制资源(CPU,内存等)的使用(例如,在Windows上,您可以创建“作业”对象,这需要单独的进程)。

安全注意事项

  • 您可以使用不同的帐户(即“用户”)运行不同的流程,从而在它们之间提供更好的隔离。

兼容性问题

  • 支持多个/不同的Java版本:使用不同的进程,您可以为应用程序部分使用不同的Java版本(如果第三方库需要)。

位置透明度

  • 您可以(可能)在多台物理机上分发您的应用程序,从而进一步提高应用程序的可伸缩性和/或健壮性(有关详细信息/原始想法,请参阅@Qwe's answer)。

答案 1 :(得分:6)

如果您决定使用线程,则会限制您的应用在一台计算机上运行。此解决方案无法扩展(或在某种程度上扩展) - 始终存在硬件限制。

通过套接字进行通信的不同进程可以在机器之间分配,因此您可以添加几乎无限数量的进程。这会以流程之间缓慢通信为代价进行扩展。

确定哪种方法更合适本身就是一项非常有趣的任务。一旦你做出决定,就无法保证在需求变化或新硬件可用的几年内,你的继任者看起来会很愚蠢。