Java并发技术总结之一——Java线程池

2020-07-15 15:54:54 浏览数 (3)

一. Java 线程池

1.1 实现

  1. 线程数小于 coreSize,创建线程,直到 coreSize 的数量;
  2. BlockingQueue 一直堆积线程;堆积到 BlockingQueue 的最大容量,此时开始开启线程,直到 maxSize;
  3. 如果到了 maxSize 的线程数,BlockingQueue 依然是满的,则开始对新添加进入的任务实行拒绝(按照拒绝策略);
  4. 如果线程数量大于 coreSize,而且有的线程空闲时间超过了 keepTimeAlive,则释放该资源;

注:1, 2, 3 步骤在 ThreadPoolExecutor # execute(Runnable command) 方法中;

1.2 核心构造参数

  • coreSize: 核心线程数量,平时维持的线程数量;
  • maxSize: 最大线程数量,如果 BlockingQueue 任务队列里堆积的任务过多,超过了队列限定最大值,则线程增多,增多至 maxSize 的线程数量;
  • BlockingQueue<Runnable>: 任务队列,向其中放任务;可通过设定队列最大长度,设置最大任务数量;
  • keepTimeAlive: 如果当前线程数量大于 coreSize,且线程空闲超过 keepTimeAlive 值,则释放该线程,最多释放到 coreSize 的线程数量;
  • RejectPolicy: 拒绝策略;当队列已满,再向其中塞任务时的拒绝策略;
  • threadFactory: 线程工厂,使用各自的方法生产线程;比如可以使用 NamedThreadFactory,可以为线程池命名;

1.3 拒绝策略

  • ThreadPoolExecutor.AbortPolicy:丢弃任务并抛出 RejectedExecutionException 异常。
  • ThreadPoolExecutor.DiscardPolicy:也是丢弃任务,但是不抛出异常。
  • ThreadPoolExecutor.DiscardOldestPolicy:丢弃队列最前面的任务,然后重新尝试执行任务(重复此过程);
  • ThreadPoolExecutor.CallerRunsPolicy:由调用线程处理该任务 ;

参考地址:《线程池ThreadPoolExecutor实现原理》

0 人点赞