何时/为什么要在Java中使用Multithread?

Lou*_*ong 7 java multithreading jsp java-ee

我不知道何时应该在Java开发中使用Multithread,以及使用它的逻辑/原因.它在不同情况下有何帮助?

场景1

我正在制作一个带有敌人的2D滚动游戏,以及所有这些,想想金属slu ..

情景2

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

场景3

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

随意编辑方案以使其更好.

另外:我应该在游戏服务器上使用多线程吗?或者我不应该?

Gra*_*ray 8

我不知道何时应该在Java开发中使用Multithread,以及使用它的逻辑/原因.它在不同情况下有何帮助?

您应该将程序更改为使用线程,原因有两个.

  • 当程序运行速度明显加快并更好地利用您运行的多CPU /核心架构时.我使用"显着"这个词,因为经常添加线程会增加很多复杂性,因此20%的速度提升可能不值得.

    但是,确定您的程序是否适当地使用多个处理器可能很困难,因此重新编程是一项很好的投资.只有在涉及大量处理/计算时才会提高速度.例如,如果您的程序正在等待IO(磁盘或网络读取或写入),那么您可能会花费大量工作将程序拆分为多个线程,只是为了看不到速度提升.

  • 当程序的多个部分应该同时运行时.并不是它不能在一个线程中运行,而是这样做会更复杂.例如,Web服务器有多个请求处理线程,因为每个线程处理单个请求更容易,即使您可能没有通过服务器放置大量负载,以便多个线程使其执行得更快.

另外:对于J2EE的问题,我什么时候应该在我的servlet中使用多线程?或者我不应该?

我认为上述相同的答案适用.通常,servlet是非常小的任务,旨在快速返回,因此它们分叉线程相对不常见.但是,如果有一个长时间运行的任务需要启动servlet,但是你希望它返回一个"Starting job"类型的响应,那么就需要一个线程.

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


编辑:

场景1 - 我正在制作一个带有敌人的2D滚动游戏,以及一切,想到金属slu ..

我对此没有一个好的答案.取决于是否有大量渲染正在进行,这取决于您使用的工具包.

场景2 - 我正在制作一个数据库守护进程来检查多个数据库内容.

您可能会受到数据库IO约束,因此多个线程可能无法为您提供任何帮助.然后,如果你有长时间运行的查询,如果短查询可以在其他线程上并行执行,你可能会得到一些改进.这还取决于数据库如何处理多个连接.

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

如果响应必须等待获取信息,则没有理由在另一个线程中执行此操作.但是,正如我上面提到的,如果servlet试图在后台运行某种类型的数据库事务,那么你应该使用一个线程.

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