线程池是一种用于管理和调度线程执行的技术,通过将任务分配到线程池中的线程进行处理,可以有效地控制并发线程的数量,提高系统的资源利用率和任务处理效率。在使用线程池之前,我们需要了解线程池的七大核心参数以及它们的执行顺序。
- corePoolSize(核心线程数):
线程池中一直存活的线程数量。在线程池初始化或者任务提交后,线程池会首先创建corePoolSize个线程来执行任务,即使这些线程处于空闲状态。 - maximumPoolSize(最大线程数):
线程池中允许存在的最大线程数量。如果队列中的任务数超过了maximumPoolSize,那么线程池会创建新的线程来处理该任务。可通过调整该参数来设定线程池的最大并发处理能力。 - keepAliveTime(线程空闲时间):
在线程池中,超过corePoolSize数量的线程在空闲时间超过keepAliveTime后会被销毁,以减少资源的消耗。通常情况下,线程在空闲时间超过keepAliveTime后,会被销毁直到线程池中的线程数不超过corePoolSize。 - unit(线程空闲时间单位):
keepAliveTime的时间单位。可以选择秒、毫秒、微秒等单位。 - workQueue(任务队列):
线程池中用于存储任务的队列。当任务来临时,如果当前线程数小于corePoolSize,则会创建新的线程来执行任务;如果当前线程数大于等于corePoolSize,则会将任务加入到workQueue中。 - threadFactory(线程工厂):
线程工厂用于创建线程,可以定制线程的一些属性,如线程名、优先级等。可以通过实现ThreadFactory接口来自定义线程工厂。 - handler(饱和策略):
当线程池中的线程数达到maximumPoolSize并且任务队列已满时,需要采取一种策略来处理新提交的任务。常见的饱和策略有:AbortPolicy(抛出RejectedExecutionException异常)、CallerRunsPolicy(由提交任务的线程来执行该任务)、DiscardOldestPolicy(丢弃队列中最旧的任务)和DiscardPolicy(直接丢弃新提交的任务)。
以上七个参数的执行顺序如下:
首先,当任务提交给线程池时,线程池会判断当前线程数是否小于核心线程数,如果小于则创建新线程执行任务;否则,将任务加入到任务队列中。
其次,在任务队列中,线程池会判断队列是否已满,如果已满则判断当前线程数是否小于最大线程数,如果小于则根据具体的饱和策略来决定是否创建新线程执行任务。
接着,如果任务队列未满或者线程池未达到最大线程数,则线程池会继续判断当前线程数是否小于核心线程数,如果小于则创建新线程执行任务;否则,将任务加入到任务队列中。
然后,在任务队列中的任务等待执行时,线程池会根据空闲时间判断是否销毁多余的线程,直到线程数不超过核心线程数。
最后,在线程池中如果没有可空闲的线程,并且任务队列已满,则根据具体的饱和策略来处理新提交的任务。
综上所述,线程池的核心参数在任务提交到线程池后的执行顺序是:核心线程数 -> 最大线程数 -> 线程空闲时间 -> 任务队列 -> 线程工厂 -> 饱和策略。了解线程池的核心参数及其执行顺序可以帮助我们更好地理解和使用线程池,提高程序的性能和可维护性。