ThreadPool And Worker

Jdk原生线程池

  • 容易误解的地方:core线程已满的情况下,先放queue,queue也满了的情况下,才会扩建线程,直到maxSize后,才执行拒绝策略;
image.png
  • 提交task,都发生了什么呢?
  1. 当已创建的线程数小于coreSize时,add new worker;
  2. 当大于coreSize时,新提交的task放入queue中,等待消费;
  3. 当queue满了时,继续add new worker,最多创建max个worker
  4. worker负责执行task,worker有一个for;;无限循环过程,不断从queue中获取task,如果task没有时,可以阻塞get或者get null;


    image.png
  • 可能的坑
  1. task执行耗时太长导致线程池吞吐量太低,大量task被reject
  2. 线程池可以在初始化时即预热线程,因为提交task是同步方法,导致等锁挤压;
  3. Executors提供的几个常用常用的线程池,queue的size都是Integer.Max,如果消费的慢,很容易oom

你可能感兴趣的:(ThreadPool And Worker)