Java 线程池的原理知道吗?
线程池的好处
- 降低资源消耗。重复利用已创建的线程降低线程创建和销毁造成的消耗。
- 提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。
- 提高线程的可管理性。线程是稀缺资源,如果频繁创建,会消耗系统资源,降低系统稳定性,使用线程池统一分配、调优和监控。
线程池有核心参数:
-
maximumPoolSize:最大线程数。线程池允许创建的最大线程数。
-
corePoolSize:核心线程数。当提交一个任务到线程池时,线程池会创建一个线程来执行任务,即使其他空闲的核心线程能够执行新任务也会创建线程,等到 需要执行的任务数大于线程池基本大小时就不再创建。如果调用了线程池的 prestartAllCoreThreads() 方法,则线程池会提前创建并启动所有基本线程。
-
keepAliveTime:线程活动保持时间 ,线程池的工作线程空闲后,保持存活的时间。
-
runnableTaskQueue:任务队列,用于保存等待执行的任务的阻塞队列。有四种:ArrayBlockingQueue、LinkedBlockingQueue、SynchronousQueue、PriorityBlockingQueue。。
-
RejectedExecutionHandler 拒绝策略。当队列和线程满了后,采取一种策略处理提交的新任务。
线程池执行流程?
当提交一个新任务到线程池时,具体的执行流程如下:
- 当我们提交任务,线程池会根据 corePoolSize 大小创建若干任务数量线程执行任务
- 当任务的数量超过 corePoolSize 数量,后续的任务将会进入阻塞队列阻塞排队。
- 当阻塞队列也满了之后,那么将会继续创建(maximumPoolSize-corePoolSize)个数量的线程来执行任务,如果任务处理完成,maximumPoolSize-corePoolSize 额外创建的线程等待 keepAliveTime 之后被自动销毁
- 如果达到 maximumPoolSize,阻塞队列还是满的状态,那么将根据不同的拒绝策略对应处理。
















