1. import java.util.concurrent.*;
  2. public class ExecutorTest {
  3. public static void main(String[] args) {
  4. // 创建线程池 , 参数含义 :(核心线程数,最大线程数,加开线程的存活时间,时间单位,任务队列长度)
  5. ThreadPoolExecutor pool = new ThreadPoolExecutor(5, 8,
  6. 0L, TimeUnit.MILLISECONDS,
  7. new LinkedBlockingQueue<Runnable>(2));
  8. //设置:任务数 = 3 ~ 11 ,分析:任务数 与 活跃线程数,核心线程数,队列长度,最大线程数的关系。
  9. int a = 3;
  10. for (int i = 1; i <= a; i++) {
  11. int j = i;
  12. pool.submit(new Runnable() {
  13. @Override
  14. public void run() {
  15. //获取线程名称
  16. Thread thread = Thread.currentThread();
  17. String name = thread.getName();
  18. //输出
  19. int activeCount = pool.getActiveCount();
  20. System.out.println("任务:"+j+"-----,线程名称:"+name+"-----活跃线程数:"+activeCount);
  21. }
  22. });
  23. }
  24. //关闭线程池
  25. pool.shutdown();
  26. }
  27. }

输出结果: :::tips

  1. # 任务数 a = 3 , 活跃线程数3 , 任务数 < 核心线程数。
  2. # 任务数 a = 4 , 活跃线程数4 , 任务数 < 核心线程数。
  3. # 任务数 a = 5 , 活跃线程数5 , 任务数 = 核心线程数。
  4. # 任务数 a = 6 , 活跃线程数5 , 任务数 < 核心线程数5 + 队列长度2 。
  5. # 任务数 a = 7 , 活跃线程数5 , 任务数 = 核心线程数5 + 队列长度2 。
  6. # 任务数 a = 8 , 活跃线程数6 , 任务数 < 最大线程数8 + 队列长度2 。活跃线程数是在核心线程数5的基础上,加1个活跃线程。
  7. # 任务数 a = 9 , 活跃线程数7 , 任务数 < 最大线程数8 + 队列长度2 。活跃线程数是在核心线程数5的基础上,加2个活跃线程。
  8. # 任务数 a = 10 , 活跃线程数8 , 任务数 = 最大线程数8 + 队列长度2 。活跃线程数是在核心线程数5的基础上,加3个活跃线程。
  9. # 任务数 a = 11 , 活跃线程数8 , 任务数 > 最大线程数8 + 队列长度2 。抛出异常RejectedExecutionException ::: 结论: :::danger

    总结

    随着任务数量的增加,会增加活跃的线程数。

    当活跃的线程数 = 核心线程数,此时不再增加活跃线程数,而是往任务队列里堆积。

    当任务队列堆满了,随着任务数量的增加,会在核心线程数的基础上加开线程。

    直到活跃线程数 = 最大线程数,就不能增加线程了。

    如果此时任务还在增加,则: 任务数11 > 最大线程数8 + 队列长度2 ,抛出异常RejectedExecutionException,拒绝任务

    ::: https://blog.csdn.net/AinUser/article/details/121627261

    CallerRunsPolicy()
    https://juejin.cn/post/6982123485103390734