Jdk原生线程池
- 容易误解的地方:core线程已满的情况下,先放queue,queue也满了的情况下,才会扩建线程,直到maxSize后,才执行拒绝策略;
- 提交task,都发生了什么呢?
- 当已创建的线程数小于coreSize时,add new worker;
- 当大于coreSize时,新提交的task放入queue中,等待消费;
- 当queue满了时,继续add new worker,最多创建max个worker
-
worker负责执行task,worker有一个for;;无限循环过程,不断从queue中获取task,如果task没有时,可以阻塞get或者get null;
- 可能的坑
- task执行耗时太长导致线程池吞吐量太低,大量task被reject
- 线程池可以在初始化时即预热线程,因为提交task是同步方法,导致等锁挤压;
- Executors提供的几个常用常用的线程池,queue的size都是Integer.Max,如果消费的慢,很容易oom