gpt4 book ai didi

java - 什么时候适合多线程?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:31:15 26 4
gpt4 key购买 nike

我想我“掌握”了 Java 多线程的基础知识。如果我没记错的话,您需要做一些大工作,并弄清楚如何将其分解为多个(并发)任务。然后将这些任务实现为 RunnableCallable 并将它们全部提交给 ExecutorService。 (所以,首先,如果我错了这么多,请先纠正我!!!)

其次,我必须想象您在 run()call() 中实现的代码必须尽可能“并行化”,使用非阻塞算法等。这就是困难的部分(编写并行代码)。 对吗?不正确?

但是我在 Java 并发性方面仍然遇到的真正问题(我猜一般来说是并发性),也是这个问题的真正主题,是:

When is it even appropriate to multi-thread in the first place?

我在 Stack Overflow 上的另一个问题中看到了一个示例,发帖者提议创建多个线程来读取和处理一个巨大的文本文件(白鲸记 一书),一位回答者评论说多线程因为从磁盘读取是一个糟糕的想法。他们这样做的原因是,您会有多个线程引入上下文切换的开销,已经很慢的进程(磁盘访问)之上。

这让我开始思考:哪些类别的问题适合多线程,哪些类别的问题应该始终序列化?提前致谢!

最佳答案

多线程有两个主要优点,IMO:

  • 能够在多个 CPU/核心上分配密集型工作:与其让 4 个 CPU 中的 3 个闲置并在一个 CPU 上完成所有工作,不如将问题分成 4 个部分,让每个 CPU 各干各的。这减少了执行 CPU 密集型任务所需的时间,并证明您花在多 CPU 硬件上的钱是值得的
  • 减少许多任务的延迟。假设有 4 个用户向 Web 服务器发出请求,并且请求都由单个线程处理。假设第一个请求进行了一个很长的数据库查询。线程空闲,等待查询完成,其他 3 个用户等待此请求完成以获取他们的小网页。如果你有 4 个线程,即使只有一个 CPU,也可以在数据库服务器执行长数据库查询的同时处理第二个、第三个和第四个请求,所有用户都会很高兴。因此,当您有阻塞 IO 调用时,多线程尤为重要,因为这些阻塞 IO 调用会让 CPU 空闲,而不是执行其他一些等待任务。

注意:从多个线程读取同一磁盘的问题在于,它不是按顺序读取整个长文件,而是会强制磁盘在每次上下文切换时在磁盘的不同物理位置之间切换。由于所有线程都在等待磁盘读取完成(它们是 IO 绑定(bind)的),这使得读取速度比单个线程读取所有内容要慢。但是一旦数据在内存中,在线程之间拆分工作就有意义了。

关于java - 什么时候适合多线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11266484/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com