8

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

方案 1

我正在制作一个有敌人的 2D 滚动游戏,想想金属弹头

方案 2

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

方案 3

我正在为 JSP 制作一个 servlet,其中包含从数据库中获取的一些信息。

随意编辑场景以使其更好。

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

4

5 回答 5

9

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

出于几个不同的原因,您应该更改程序以使用线程。

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

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

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

另外:对于 J2EE 的东西,我应该什么时候在我的 servlet 中使用多线程?还是我不应该?

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

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


编辑:

场景 1 - 我正在制作一个有敌人的 2D 卷轴游戏,比如金属弹头

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

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

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

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

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

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

于 2013-08-14T16:00:48.360 回答
2

不知道什么时候应该在Java开发中使用Multithread

-那你不应该。此外,如果您可以避免它,请务必这样做。

何时:一个例子:如果您需要同时从多个站点/资源获取不同股票的市场份额值以更新不同的经纪人系统,您可能需要作为单个线程必须先从一个站点获取它之前尝试从下一个获取。

根据您对问题的编辑 -

Secnario 1:我正在制作一个有敌人的 2D 卷轴游戏,比如金属弹头

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

于 2013-08-14T16:01:07.667 回答
2

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

于 2013-08-14T16:03:26.993 回答
1

这不像你曾经学习过多线程,然后你一直在到处使用它。在需要时使用多线程。

例如,您有一个很长的任务要做,并且您不想锁定 UI,您可以在 UI 仍然运行良好的情况下在另一个线程上执行该任务。那将是一种情况。

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

于 2013-08-14T16:03:11.090 回答
1

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

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

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

于 2013-08-14T16:00:06.620 回答