一尘不染

什么时候/为什么要在Java中使用多线程?

jsp

我不知道何时应该在Java开发中使用多线程,以及使用它的逻辑/原因。在不同情况下如何提供帮助?

场景1

我正在制作带有敌人和所有元素的2D滚动游戏,想想金属弹头

方案2

我正在制作一个数据库守护程序来检查多个数据库内容。

情况3

我正在为JSP创建servlet,并从数据库中获取了一些信息。

随时编辑方案以使其更好。

另外:我应该为游戏服务器使用多线程吗?还是我不应该?


阅读 987

收藏
2020-06-08

共1个答案

一尘不染

我不知道何时应该在Java开发中使用多线程,以及使用它的逻辑/原因。在不同情况下如何提供帮助?

您应出于多种原因将程序更改为使用线程。

  • 该程序将以更快的速度运行并更好地利用您所运行的多个CPU /内核体系结构。我使用“显着”一词是因为经常添加线程会增加很多复杂性,因此将速度提高20%可能不值得。

但是,可能很难确定您的程序是否将正确地使用多个处理器,以便对程序进行重新加工是一项不错的投资。只有在涉及大量处理/计算的情况下,您才能提高速度。例如,如果您的程序正在等待IO(磁盘或网络读或写),那么您可能会花费大量工作将一个程序拆分为多个线程,而看不到速度的提高。

  • 当程序的多个部分应同时运行时。不是说它不能在一个线程中运行,而是这样做会更加复杂。例如,一个Web服务器具有多个请求处理线程,因为即使您可能没有在服务器上增加大量负载,以便使多个线程执行得更快,但使每个线程处理一个请求更容易。

另外:对于J2EE的问题,我应该何时在servlet中使用多线程?还是我不应该?

我认为上述相同的答案也适用。通常,servlet是非常小的任务,旨在快速返回,因此它们分叉线程是相对不常见的。但是,如果Servlet需要启动一个长期运行的任务,但您希望它返回“启动作业”类型的响应,则将需要一个线程。

重要的是要注意,到执行servlet时,上游处理程序可能已经在使用线程池,因此您无需执行任何操作。


编辑:

场景1-我正在制作带有敌人和所有元素的2D滚动游戏,想想金属弹头

我对此没有很好的答案。取决于是否正在进行大量渲染,还取决于您使用的是什么工具包。

方案2-我正在制作一个数据库守护程序来检查多个数据库内容。

您可能会受到数据库IO的约束,因此多个线程可能不会给您任何东西。再说一次,如果您有长时间运行的查询,那么如果短查询可以在其他线程上并行执行,则可能会有所改善。这还取决于数据库如何处理多个连接。

场景3-我正在为JSP创建servlet,并从数据库中获取了一些信息。

如果响应必须等待信息获取,则没有理由在另一个线程中执行此操作。但是,如上所述,如果servlet试图派生在后台运行的某种数据库事务,则应该使用线程。

同样,大多数servlet容器已经在线程池中运行。

2020-06-08