• workerCount 有效的线程数
  • runState 运行的状态

    线程池的运行状态(生命周期)

  • RUNNING 接受新任务 && 执行队列任务

  • SHUTDOWN 不在接受新任务,但是依旧处理队列任务
  • STOP 不在接受新任务,不在处理队列任务,中断正在处理的任务
  • TIDYING 所有任务已经停止,workerCount为0 ,线程状态变更为TIDYING,将会调用hook的terminated()方法
  • TERMINATED terminated() 调用完成

    流转状态

    image.png

GC无法回收ThreadPoolExecutor

  1. public static void testGC() throws InterruptedException {
  2. final ThreadPoolExecutor executorService =
  3. new ThreadPoolExecutor(2, 2,
  4. 0L, TimeUnit.MILLISECONDS,
  5. new LinkedBlockingQueue<Runnable>(),
  6. new ThreadFactory() {
  7. @Override
  8. public Thread newThread(@NotNull Runnable r) {
  9. Thread thread = new Thread(r);
  10. thread.setName("fff-" + System.currentTimeMillis());
  11. thread.setDaemon(true);
  12. return thread;
  13. }
  14. });
  15. executorService.submit(() -> System.out.println("gggod"));
  16. executorService.submit(() -> System.out.println("gggod"));
  17. System.gc();
  18. }

image.png
由于线程Thread依旧引用了ThreadPoolExecutor,尽管ThreadPoolExecutor已经不在方法的上下文当中了,它却依旧无法被回收。

因此应该尽力避免出现在方法中new ThreadPoolExecutor的情况,即使一定需要,那也要调用其shutdown方法,方便后续回收。