何时/为什么应该在Java中使用多线程?

8
我不知道在Java开发中应何时使用多线程以及使用它的逻辑/原因。它在不同情景下如何帮助你呢?

情景1

我正在制作一个2D卷轴游戏,其中包括敌人等元素(比如《合金弹头》)。

情景2

我正在制作一个数据库守护进程,用于检查多个数据库内容。

情景3

我正在为JSP制作一个servlet,并从数据库中提取一些信息。

请随意修改这些情景以使其更好。

此外:对于游戏服务器应该使用多线程吗?还是不需要?


7
这是一个过于笼统的问题... - Sebastian
@Sebastian 嗯...我搜索了一下,找到了这个答案,但是我对它不满意。所以我重新提问了一下,希望得到我想要的回答。如果这个问题太广泛了,那么这个问题也是:https://dev59.com/xWs05IYBdhLWcg3wJunp - Louis Hong
1
我相信这个问题已经足够具体,现在可以被解除保留状态了。 - supersam654
请取消此暂停状态。我需要向公众公开我的源代码才能更具体吗? - Louis Hong
5个回答

10
我不知道在Java开发中什么情况下应该使用多线程以及使用它的逻辑/原因。在不同场景下,它如何帮助解决问题?
你应该改变程序以使用线程,有几个原因。
1. 当程序可以显著提高运行速度并更好地利用您正在运行的多个CPU / 核心体系结构时。我使用“显著”一词,因为通常添加线程会增加很多复杂性,因此20%的速度提高可能并不值得。但是,确定程序是否能够正确地利用多个处理器以使重新设计的程序成为一个好的投资可能会很困难。只有在涉及大量处理/计算时才会获得速度提升。例如,如果程序正在等待IO(磁盘或网络读取或写入),则您可能需要将程序拆分为多个线程,但可能看不到速度提高。
2. 当程序的多个部分应该同时运行时。这并不是说它不能在一个线程中运行,但这样做会更加复杂。例如,Web服务器具有多个请求处理线程,因为让每个线程处理单个请求更容易,即使您可能没有通过服务器放置大量负载以使多个线程使其执行更快。
此外:对于J2EE方面的相同问题,我何时应在我的servlet中使用多线程?还是不应该?
我认为上面的相同答案适用。通常,servlet是设计为快速返回的非常小的任务,因此很少需要它们分叉线程。但是,如果有一个长时间运行的任务需要servlet启动,但您希望它返回“开始作业”类型的响应,则需要一个线程。
重要的是要注意,当执行您的servlet时,上游处理程序可能已经使用线程池,因此您无需采取任何措施。
编辑:
场景1-我正在制作一个具有敌人和所有内容(类似于金属弹头)的2D滚动游戏。
对此我没有好的答案。这取决于是否有大量渲染以及您正在使用哪些工具包。
场景2-我正在制作一个数据库守护程序来检查多个数据库内容。
很可能您将受到数据库IO限制,因此多个线程可能不会给您任何东西。然而,如果您有长时间运行的查询,则如果其他线程上的短查询可以并行执行,则可能会获得一些改进。这还取决于您的数据库如何处理多个连接。
场景3-我正在为JSP制作一个servlet,并从数据库中获取一些信息。
如果响应需要等待信息获取,那么就没有理由在另一个线程中执行。然而,如上所述,如果servlet正在尝试分叉运行在后台的某种数据库事务,则应使用线程。
再次强调,大多数servlet容器已经在线程池中运行。

那么像 Tomcat 这样的服务器会自动处理多线程,对吗? - Louis Hong
1
没错,@Louie。当你的servlet被调用时,已经有多个线程在使用了。你可以通过jconsole看到它们。 - Gray

3
我不知道在Java开发中何时应该使用多线程。
-如果您能避免使用它,请尽量避免使用它。
-何时应该使用:例如,如果您需要同时从多个网站/资源获取不同股票的市场份额值以更新不同的经纪人系统,则可能需要使用多线程,因为单个线程必须首先从一个站点获取,然后再尝试从下一个站点获取。
-基于您在问题中的编辑-
场景1:我正在制作一个带有敌人和所有这些2D滚动游戏,类似于金属弹头。
-是的,您可以这样做。一个示例是,在一个线程中加载资源,同时在另一个线程中在屏幕上显示“正在加载…”动画。

1
在处理器战争基于核心而非赫兹的时代,我认为说“如果可以避免,尽量避免”是不明智的。是的,当使用不当或错误时,它可能会引起问题,但这并不意味着应该不惜一切代价避免它。多线程应该负责任地使用。 - digitaljoel
@digitaljoel 你误解了我的意思。我的回答适用于那些刚开始学习Java开发的人,他们会说“我不知道何时应该在Java开发中使用多线程”,这意味着他们还很新手,当他们能够回答自己的问题时,他们已经学习/研究足够了,知道了你所说的内容。但是,由于OP想知道何时使用,我确实给出了一些例子。 - Sajal Dutta

2

如果您认为某些任务可以并行处理或者可以变成异步的,那么请使用多线程。

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

异步性是指,在生产者-消费者情况下,您有一段代码制造东西,而其余部分则消耗它。


2
假设您有一个负责下载文件的应用程序,如果您不使用多个线程,则所有其他指令都将等待文件下载完成。例如Swing使用一个特殊的线程来显示它的GUI界面,因此您应该查看此教程并了解一些并发性知识。

1

学习了多线程编程并不意味着你会在所有场景下都使用它,而是需要在需要的时候才使用。

例如,当你有一个耗时的任务时,并且不想锁定用户界面,你可以在另一个线程上执行该任务,同时你的用户界面仍然能够正常工作。这将是一种情况。

另一种情况是计算某些复杂的东西,可以通过许多独立的步骤完成,那么就可以使用多线程并行处理。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接