ThreadPoolExecutor参数解析
private ExecutorService createThreadPool(int poolSize) { return new ThreadPoolExecutor( corePoolSize, // corePoolSize(核心线程数) maximumPoolSize, // maximumPoolSize(最大线程数) 60L, // 线程空闲60秒后回收 maximumPoolSize > corePoolSize 时,超出核心数的线程空闲 60 秒后才会被回收 TimeUnit.SECONDS, // unit(时间单位) new LinkedBlockingQueue<>(1000), // workQueue(任务队列) new ThreadFactory() { // threadFactory(线程工厂) private final AtomicInteger count = new AtomicInteger(0); @Override public Thread newThread(Runnable r) { Thread thread = new Thread(r, "user-info-sdk-" + count.incrementAndGet()); //使用的是daemon线程,executor.shutdown()后; //daemon线程会被销毁,线程销毁时; //其ThreadLocal会自动被GC回收; //只需要清理调用close()的那个线程即可; thread.setDaemon(true); return thread; } }, new ThreadPoolExecutor.AbortPolicy() // handler(拒绝策略) ); }1. corePoolSize = corePoolSize (核心线程数)
线程池中始终保持存活的线程数量,即使它们空闲也不会被回收。
当前值:25(来自 config.getThreadPoolSize())
含义:线程池启动后会创建并保持 25 个工作线程
2. maximumPoolSize = maximumPoolSize(最大线程数)
线程池允许创建的最大线程数量。
当前值:50(与核心线程数相同)
含义:这是一个会弹性的线程池,弹性扩展(生产环境建议设置成一样的,不进行弹性变化)
执行逻辑:当队列满了且线程数已达最大时,触发拒绝策略
3. keepAliveTime = 60L + TimeUnit.SECONDS
非核心线程空闲后的存活时间。
当前值:60秒
注意:因为 corePoolSize == maximumPoolSize,不存在"非核心线程",所以这个参数实际上不生效
只有当 maximumPoolSize > corePoolSize 时,超出核心数的线程空闲 60 秒后才会被回收
4. workQueue = new LinkedBlockingQueue<>(1000)(任务队列)
当核心线程都在忙时,新提交的任务会先进入这个队列等待。
当前值:容量为 1000 的有界阻塞队列
执行顺序:
核心线程有空 → 直接执行
核心线程都忙 → 放入队列等待
队列也满了 → 尝试创建非核心线程(如果核心线程和最大线程数一直 core=max,不会再创建)
触发拒绝策略
5. threadFactory(线程工厂)
控制每个线程的名称、优先级、守护线程属性。
daemon=true 的重要性:
如果设为 false(用户线程),即使 main 方法结束了,JVM 也不会退出,因为用户线程还在运行
设为 true(守护线程),main 结束后 JVM 正常退出,守护线程随之销毁
6. handler = new ThreadPoolExecutor.AbortPolicy()(拒绝策略)
当线程池和队列都满了时的处理方式。
