java - Java 中的线程池究竟在做什么?

标签 java multithreading threadpool

线程池与任何 ExecutorServices 一样,我们定义了一个大小为 3 的新固定池。现在我有一个包含大约 10000 个可运行任务的队列。 对于执行上述过程,我有这些疑问 -

  1. 要执行上述流程,执行者是否会一次只让任务队列中的 3 个线程运行?

  2. Pool 将承载 3 个 Threads ,而这 3 个线程将只负责执行所有 10000 个任务。如果它是正确的,单个线程如何运行不同的可运行任务,因为最终这些任务也是线程本身,并且在任何作业/任务的运行过程中,您可以为池线程分配新的责任。

最佳答案

  1. 是的,如果您实际上正在使用 Executors.newFixedThreadPool(3)

  2. ,一次最多只有 3 个线程在池中
  3. 10,000 个任务不是线程,它们只是RunnablesThread 必须通过Thread#start 启动才能真正创建系统线程。任务(Runnable 的实例)被放置在 BlockingQueue 中。线程池中的线程将轮询 BlockingQueue 以寻找要运行的任务。当他们完成任务时,他们返回到队列中去拿另一个。如果添加了更多任务,则根据该队列的实现规则将它们插入到 BlockingQueue 中。对于大多数队列来说,这是先进先出的,但是 PriorityQueue 实际上使用 Comparator 或自然顺序来对插入的任务进行排序。

关于java - Java 中的线程池究竟在做什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10360974/

相关文章:

java - 比较字符串是否具有相同的位数

c# - 线程池中的线程

c# - 如何在 C# 应用程序中启用 MMCSS?

multithreading - Pharo Smalltalk 中的 ThreadLocal 类

c++ - 在 C++ 中使用 pthreads 实现线程池

java - 如何在 Java 中使用 ScheduledThreadpoolExecutor 重新启动终止的线程?

Java Xml 元素 - 获取文件中的节点位置

java - 为什么 java.util.Calendar.DATE 代表 "day of month"?

java - 将现有的 sqlite 数据库文件从 Assets 复制到 Android 项目时遇到问题

Java多线程应用程序只使用一个核心