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

时间:2013-08-14 15:56:30

标签: java multithreading jsp java-ee

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

场景1

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

场景2

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

场景3

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

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

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

5 个答案:

答案 0 :(得分:7)

  

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

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

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

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

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

  

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

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

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


编辑:

  

场景1 - 我正在与敌人进行2D滚动游戏以及所有这些,想到金属slu

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

  

场景2 - 我正在创建一个数据库守护程序来检查多个数据库内容。

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

  

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

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

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

答案 1 :(得分:1)

当您认为某些内容可以并行化或可以异步时,请使用多线程。

并行化例如:在构建Web爬虫时,您可以使用并行线程浏览不同的页面等。这也可能意味着更好地利用资源(CPU,I / O等)

在某种意义上是异步的,在产品 - 消费者的情况下,你有一块代码产生的东西,其余的消费它。

答案 2 :(得分:1)

  

我不知道何时应该在Java开发中使用Multithread

- 然后你不应该。此外,如果你可以避免它,一定要这样做。

何时:示例:如果您需要同时从多个站点/资源中获取不同股票的市场份额值来更新不同的代理系统,您可能需要作为单个线程在尝试从下一个站点开始尝试之前,必须先从一个站点获取。

根据您的问题编辑 -

  

Secnario 1:我正在与敌人和所有人进行2D滚动游戏   那,想想金属slu

是的,你可以。一个例子是在一个线程中加载资源,同时在另一个线程的屏幕上显示“加载...”动画。

答案 3 :(得分:1)

这并不像你曾经学过多线程,然后你无处不在地使用它。您需要时使用多线程。

例如,您有很长的任务要做,并且您不想锁定UI,您可以在UI仍能正常工作的同时在另一个线程上执行该任务。这将是一种情况。

另一种方法是计算可以在许多独立步骤中完成的复杂事件,然后可以使用多线程并行完成。

答案 4 :(得分:1)

假设你有一个负责下载文件的应用程序,如果你不使用多个线程,所有其他指令都要等到文件完成下载。例如,Swing使用一个特殊的线程来显示他的gui,所以你应该看一下this教程并阅读一点concurrency