Java 线程池的原理知道吗?

线程池的好处

  • 降低资源消耗。重复利用已创建的线程降低线程创建和销毁造成的消耗。
  • 提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。
  • 提高线程的可管理性。线程是稀缺资源,如果频繁创建,会消耗系统资源,降低系统稳定性,使用线程池统一分配、调优和监控。

线程池有核心参数:

  1. maximumPoolSize:最大线程数。线程池允许创建的最大线程数。

  2. corePoolSize:核心线程数。当提交一个任务到线程池时,线程池会创建一个线程来执行任务,即使其他空闲的核心线程能够执行新任务也会创建线程,等到 需要执行的任务数大于线程池基本大小时就不再创建。如果调用了线程池的 prestartAllCoreThreads() 方法,则线程池会提前创建并启动所有基本线程。

  3. keepAliveTime:线程活动保持时间 ,线程池的工作线程空闲后,保持存活的时间。

  4. runnableTaskQueue:任务队列,用于保存等待执行的任务的阻塞队列。有四种:ArrayBlockingQueue、LinkedBlockingQueue、SynchronousQueue、PriorityBlockingQueue。。

  5. RejectedExecutionHandler 拒绝策略。当队列和线程满了后,采取一种策略处理提交的新任务。

线程池执行流程?

当提交一个新任务到线程池时,具体的执行流程如下:

  1. 当我们提交任务,线程池会根据 corePoolSize 大小创建若干任务数量线程执行任务
  2. 当任务的数量超过 corePoolSize 数量,后续的任务将会进入阻塞队列阻塞排队。
  3. 当阻塞队列也满了之后,那么将会继续创建(maximumPoolSize-corePoolSize)个数量的线程来执行任务,如果任务处理完成,maximumPoolSize-corePoolSize 额外创建的线程等待 keepAliveTime 之后被自动销毁
  4. 如果达到 maximumPoolSize,阻塞队列还是满的状态,那么将根据不同的拒绝策略对应处理。