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

wan*_*ist 8 java concurrency multithreading

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

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

我个人认为这应该使用线程而不是进程来完成,但是什么参数可以捍卫原始设计?

Chr*_*n.K 9

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

历史原因

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

稳健性和容错性

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

  • 有些组件是错误的,您不希望它们能够影响多个进程.比如说,如果某个组件有内存或资源泄漏,最终可能会强制重新启动进程,那么只会影响使用该组件的进程.

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

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

操作系统资源限制与治理

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

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

安全考虑因素

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

兼容性问题

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

位置透明度

  • 您可以(可能)在多个物理机器上分发您的应用程序,从而进一步提高应用程序的可伸缩性和/或稳健性(请参阅@ Qwe的答案以了解更多详细信息/最初的想法).


Ole*_*eev 6

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

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

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