线程池的运行处理流程主要可以分为以下几个步骤:
1、任务提交: 当一个任务被提交给线程池时,线程池首先会判断核心线程池(corePoolSize)是否已满。如果核心线程池未满,线程池会创建一个新的工作线程来执行任务。如果核心线程池已满,进入下一步。
2、任务队列: 如果核心线程池已满,新提交的任务会被放入工作队列(workQueue)中。如果工作队列已满,进入下一步。
3、创建额外线程: 如果工作队列已满,且当前线程总数小于最大线程数(maximumPoolSize),线程池会创建新的线程来处理被添加到工作队列中的任务。如果当前线程总数已达到最大线程数,进入下一步。
4、拒绝策略: 如果当前线程总数已达到最大线程数,且工作队列也已满,线程池会采用预定义的拒绝策略(RejectedExecutionHandler)来处理无法执行的任务。
在自定义线程池时,可以配置的参数与它们的意义:
1、corePoolSize (核心线程池大小):线程池中始终运行的线程数。即使这些线程空闲,线程池也不会将它们回收。
2、maximumPoolSize (最大线程数):线程池允许的最大线程数。这包括核心线程和临时线程。
3、keepAliveTime (空闲线程存活时间):当线程数量超过核心线程数时,多余的空闲线程能够存活的时间。经过这个时间后,多余的线程将被销毁到核心线程数。
4、unit (keepAliveTime的时间单位):keepAliveTime参数的时间单位。
5、workQueue (工作队列):一个阻塞队列,用于存储等待执行的任务。线程池中的线程从这个队列中取任务并执行。
6、threadFactory (线程工厂):一个ThreadFactory,用于创建新线程。通过自定义ThreadFactory,可以给线程设置有意义的名字,或者设置线程的优先级。
7、handler (拒绝策略):当工作队列满并且线程数量达到最大线程数时,新提交的任务将通过拒绝策略来处理。常用的拒绝策略有ThreadPoolExecutor.AbortPolicy(抛出RejectedExecutionException)、ThreadPoolExecutor.CallerRunsPolicy(由提交任务的线程来执行该任务)、ThreadPoolExecutor.DiscardPolicy(丢弃无法执行的任务,不做任何处理)、ThreadPoolExecutor.DiscardOldestPolicy(丢弃最旧的未处理的任务请求)。
本文作者:whitebear
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!