1.用64位的AtomicLong来表示启用的线程数及空闲的线程数
(1)高32位表式启用的线程数(Integer.MIN_VALUE表示线程池停止),低32位表式空闲的线程数
(2) 每新建一个线程,启用的线程数加1,空闲的线程数加1
(3)提交一个任务空闲的线程数减1,执行完一个任务空闲的线程数加1
(4)即低32位可以为负数,绝对值表示阻塞队列中任务的数量
2.QueuedThreadPool与ThreadPoolExecutor的区别
(1) QueuedThreadPool只有两个状态,用Integer.MIN_VALUE表示线程池停止,而ThreadPoolExecutor有5种状态
(2)QueuedThreadPool中任务先添加到阻塞队列中,ThreadPoolExecutor中的任务可直接给核心线程执行
(3)QueuedThreadPool中当空闲线程不够时,直接创建新的线程,而ThreadPoolExecutor要等到阻塞队列满的时候才创建新的线程
(4)QueuedThreadPool中核心线程是不能回收的,而ThreadPoolExecuor中可以设置回收核心线程
(5)QueuedThreadPool中非核心线程的回收是按idleTimeout间隔一个个回收的(即串行),而ThreadPoolExecutor中非核心线程是按每个线程poll(keepAliveTime,TimeUnit.NANOSECONDS)来回收的(即并行)
(6)QueuedThreadPool无法统计已完成的任务数量