【发布时间】:2021-07-10 19:00:05
【问题描述】:
在 Brian Goetz 等人的《Java Concurrency in Practice》一书中:
如果线程池太大,那么线程会争夺稀缺的 CPU 和内存资源,从而导致更高的内存使用率和可能的资源耗尽。如果它太小,则吞吐量会受到影响,因为尽管有可用的工作,但处理器仍处于未使用状态。
这意味着如果我们在线程池中创建了太多的线程对象,那么它们会消耗太多的内存。此外,如果我们有太多线程(例如 10 个 CPU 内核的 1000 个线程,有 1000 个任务提交到线程池),那么每个任务将被分配给一个内核,但可能在它完成之前被抢占,然后另一个任务将分配给核心。因此,由于抢先式调度,每个任务可能都需要很长时间才能完成。
线程是否正在竞争其他资源?
【问题讨论】:
-
这是无法回答的。这完全取决于线程在做什么:如果它们正在访问数据库,那么它们会竞争数据库,如果它们访问磁盘/网络/一些同步的代码块/其他任何东西,它们就会竞争那些。如果您可以命名可以竞争的资源,那么有人可以编写竞争它的线程。
-
但是由于我们有 10 个内核,因此在任何给定时间只有 10 个线程会访问数据库(即使我们在池中有 1000 个线程),那么为什么拥有更多线程会对此产生任何影响数据库访问?
-
您可以运行比内核更多的线程。 CPU 可以将一些时间用于一个,然后将一些时间用于另一个,等等。如果这些“时间”不同步(注意:它们不会),那么您可以拥有比您更多的活动数据库连接有核心。
标签: java multithreading