线程和任务的本质

在Java中,所谓的线程池中的“线程”,其实是被抽象为了一个静态内部类Worker,它基于AQS实现,存放在线程池的HashSet<Worker> workers成员变量中;
而需要执行的任务则存放在成员变量workQueue(BlockingQueue<Runnable> workQueue)中。这样,整个线程池实现的基本思想就是:从workQueue中不断取出需要执行的任务,放在Workers中进行处理。


线程池

Java 中的线程池是通过 java.util.concurrent 包中的 Executor 框架来实现的。线程池可以有效地管理和复用线程,以提高多线程任务的执行效率和资源利用率。

以下是线程池的简要介绍:

  1. 线程池接口和实现类:
  • Executor 接口是线程池的顶层接口,定义了执行任务的方法。
  • ExecutorService 接口继承自 Executor,扩展了一些管理线程池的方法,例如提交任务、终止线程池等。
  • ThreadPoolExecutorExecutorService 接口的主要实现类,提供了灵活的线程池实现,可以根据需求自定义线程池的核心线程数、最大线程数、任务队列等参数。
  1. 线程池的工作原理:
  • 线程池内部维护了一组可重用的线程,这些线程在需要执行任务时被动态调度。
  • 当有任务提交到线程池时,线程池会根据配置的参数判断是否创建新的线程来执行任务。
  • 如果当前线程池中的线程数未达到核心线程数,则创建新线程来执行任务。
  • 如果当前线程池中的线程数已达到核心线程数,任务会被放入任务队列进行等待。
  • 如果任务队列已满,且当前线程数未达到最大线程数,则创建新线程来执行任务。
  • 如果当前线程数已达到最大线程数,且任务队列也已满,则根据线程池的拒绝策略来处理无法执行的任务。
  1. 线程池的参数和配置:
  • 核心线程数(corePoolSize):线程池中保持的最小线程数,即使线程处于空闲状态也不会被回收。
  • 最大线程数(maximumPoolSize):线程池中允许的最大线程数,包括核心线程数和非核心线程数。
  • 任务队列(workQueue):用于存放待执行任务的队列,可以是有界队列(如 ArrayBlockingQueue)或无界队列(如 LinkedBlockingQueue)。
  • 线程池的拒绝策略(rejectedExecutionHandler):当线程池无法执行新任务时的处理策略,例如抛出异常、丢弃任务等。
  • 空闲线程的存活时间(keepAliveTime):当线程池中的线程数超过核心线程数时,空闲线程的最大存活时间。