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 的有界阻塞队列执行顺序核心线程有空 → 直接执行核心线程都忙 → 放入队列等待队列也满了 → 尝试创建非核心线程如果核心线程和最大线程数一直 coremax不会再创建触发拒绝策略5. threadFactory线程工厂控制每个线程的名称、优先级、守护线程属性。daemontrue 的重要性如果设为 false用户线程即使 main 方法结束了JVM 也不会退出因为用户线程还在运行设为 true守护线程main 结束后 JVM 正常退出守护线程随之销毁6. handler new ThreadPoolExecutor.AbortPolicy()拒绝策略当线程池和队列都满了时的处理方式。