Java 线程池2021-04-10

每一个线程都是一个Worker对象。

Worker是ThreadPoolExecutor的内部类。Worker继承于AQS,本身是一把锁。这把锁有什么用?在分析线程池的关闭、线程执行任务的过程时会了解到。

corePoolSize 核心线程数,在线程池中始终维护的线程个数

maxPoolSize 在线程数等于corePoolSize,队列已满的情况下,扩充线程数到这个值。

keepAliveTime/TimeUnit maxPoolSize空闲线程销毁所需的时间,总线程数会下降到corePoolSize

blockingQueue 线程池所使用的队列类型

threadFactory 线程创建工厂,可以自定义,有一个默认的DefaultThreadFactory

RejectedExecutionHandler corePoolSize已满,队列已满,maxPoolSize已满,最后的执行策略

处理流程:

  1. currentThreadNum < corePoolSize 新建线程执行;如果currentThreadNum >= corePoolSize,则执行2

  2. 判断队列是否已满。如未满,则放入,如已满,执行3

  3. currentThreadNum < maxPoolSize, 如果小于,则新建线程执行,否则执行4

  4. 根据拒绝策略,拒绝任务

总结:

先判断corePoolSize ,其次判断blockingQueue是否已满,再判断maxPoolSize,最后使用拒绝策略。

如果队列是无界的,则不可能走到第3、4步

拒绝策略

  1. 调用者直接在自己的线程里面执行,线程池不做处理
  2. 线程池直接抛出异常
  3. 线程池直接把任务丢掉
  4. 把队列里最老的任务移除,把新任务放入队列

你可能感兴趣的:(Java 线程池2021-04-10)