2012-02-18 60 views
7

为什么选择几个线程的几个进程来实现Java应用程序?何时通过Java中的线程选择多个进程?

我正在重构一个较老的java应用程序,它现在被分成几个运行在同一个多核心机器上的小应用程序(进程),通过套接字相互通信。

我个人认为这应该使用线程而不是进程来完成,但是哪些论据会捍卫原始设计?

回答

9

我(和其他人,见下面的归属),可以认为有几个原因的:

历史原因

  • 设计是当只有绿色的线是可利用的和原来的日子作者/设计师认为他们不会为他工作。

鲁棒性和容错

  • 您使用的不是线程安全的组成部分,所以你不能并行withough诉诸多个进程。

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

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

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

OS资源限制&治理

  • 如果这个过程中,使用一个线程,已经使用所有可用的地址空间(例如,在Windows 2GB的32位应用程序),你可能需要在流程中分配工作。

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

安全考虑

  • 您可以运行使用不同的账户(即 “用户”)不同的进程,从而为他们提供更好的之间的隔离。

兼容性问题

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

位置透明

  • 你可以(可能)在多个物理机器分发您的应用程序,从而进一步提高了应用程序的可扩展性和/或鲁棒性(参见@Qwe's answer /详情最初的想法)。
+0

优秀列表或论点,谢谢! – wannabeartist 2012-02-18 08:59:30

+0

+1涵盖我可能列出的所有内容。 (我会强调资源管理和特权分离项目;它们是你不可能在没有单独进程的情况下完成的工作,尽管有时候这些时间超出了分离虚拟机的范围。​​) – 2012-02-18 09:04:40

+0

+1健壮性包括'容错'就像一些进程启动并观察其他进程一样(postgres做了一些类似的事情)。 – Jayan 2012-02-18 09:13:47

6

如果您决定使用线程,您将限制您的应用程序在单台计算机上运行。此解决方案不会扩展(或在某种程度上扩展) - 总是存在硬件限制。

通过套接字进行通信的不同进程可以在机器之间分配,以便您可以添加几乎无限的数量或它们。这可以在进程间通信缓慢的代价下更好地扩展。

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

+0

非常真实。在这种情况下,应用程序应该始终在一台机器上运行,但通常是一个非常有效的考虑点。 – wannabeartist 2012-02-18 09:01:19