线程池的主要参数通常包括以下几个:
corePoolSize(核心线程数):
线程池中的常驻核心线程数。在创建了线程池后,当有请求任务来之后,就会安排池中的线程去执行请求任务。这些线程即使在空闲时也不会被销毁,除非设置了allowCoreThreadTimeOut(在Java 8及之后版本中)或者线程池被关闭。
maximumPoolSize(最大线程数):
线程池能够容纳同时执行的最大线程数。这个值必须大于等于1。当队列满了,且已创建的线程数小于最大线程数时,线程池会尝试创建新的线程来执行任务。
keepAliveTime(线程空闲存活时间):
当线程池中的线程数量超过核心线程数时,多余的空闲线程在终止前等待新任务的最长时间。这个时间参数仅对非核心线程有效,默认情况下,只有当线程池中的线程数大于corePoolSize时,keepAliveTime才会起作用。
unit(时间单位):
keepAliveTime的时间单位,可以是TimeUnit枚举中的任意一个,如SECONDS、MILLISECONDS等。
workQueue(任务队列):
用于存放待执行的任务的阻塞队列。当线程池中的线程数达到corePoolSize后,新提交的任务会被放入这个队列中等待执行。
threadFactory(线程工厂):
用于创建新线程的工厂,可以通过自定义的线程工厂来创建具有特定属性的线程。
handler(拒绝策略):
当线程池和队列都满了时,用于处理新提交任务的策略。
线程池的拒绝策略
线程池的拒绝策略定义了当线程池无法处理新提交的任务时应该采取的行为。Java的ThreadPoolExecutor类提供了四种内置的拒绝策略,也可以自定义拒绝策略。
AbortPolicy(默认策略):
直接抛出RejectedExecutionException异常来拒绝新任务。这种策略会导致提交任务的线程处理异常,因此必须确保提交任务的代码能够妥善处理这种异常。
CallerRunsPolicy:
由提交任务的线程(调用线程)来执行该任务。这种策略不会丢弃任务,也不会抛出异常,但是可能会导致提交任务的线程被阻塞,影响程序的并发性能。
DiscardPolicy:
直接丢弃任务,不抛出任何异常。这种策略可能会导致数据丢失,因为它会悄无声息地丢弃无法处理的任务。
DiscardOldestPolicy:
丢弃队列中最老的任务(即等待时间最长的任务),然后尝试执行新提交的任务。这种策略也可能会导致数据丢失,但是它会优先丢弃那些已经等待了很久的任务。
此外,还可以通过实现RejectedExecutionHandler接口来自定义拒绝策略,以满足特定的需求。
综上所述,线程池的参数和拒绝策略是Java并发编程中非常重要的概念,它们共同决定了线程池的行为和性能。在实际应用中,需要根据具体场景和需求来合理配置这些参数和选择适当的拒绝策略。