工厂方法的内部有给我们提供构造想要的实例的代码实现,所以我们只需要通过工厂方法的方法名来获取我们想要的实例即可.
线程池是Java标准库中的Java.util.concurrent.ThreadPoolExecutor类中.
标准库中提供了一个 Java.util.concurrent.ThreadPoolExecutor类
这个类中的构造方法比较多,我们主要了解参数最多最复杂的那个构造方法
我们来一个一个的解释:
corePoolSize 核心线程数和maxmumPoolSize最大线程数分别都是什么?都有什么区别?
corePoolSize 是线程池的基本大小,表示在没有任务执行时,线程池维护的线程数。即使这些线程当前处于空闲状态,它们也会被保留在池中。
当有新任务提交到线程池时,如果当前池中的线程数小于 corePoolSize,则会创建一个新线程来执行任务,即使其他线程处于空闲状态。
如果任务数超过 corePoolSize,而任务队列未满,新任务将被放入任务队列而不是新建线程(除非线程池已满)。
maximumPoolSize 表示线程池的最大大小,即线程池中允许的最大线程数。
当任务队列已满且池中线程数小于 maximumPoolSize 时,线程池会创建新的线程来执行任务,直到达到最大线程数。
超过最大线程数的任务将被拒绝(默认是抛出 RejectedExecutionException 异常,但可以通过设置拒绝策略来进行不同的处理)。
在池中运行的线程数将在 corePoolSize 和 maximumPoolSize 之间进行动态调整。
当任务数增加时,线程池会尽可能地扩展到 maximumPoolSize;当任务数减少时,线程池会逐渐收缩到 corePoolSize。
corePoolSize 提供了一种在任务轻量时保持一定线程数的机制,以提高任务的响应速度。
而 maximumPoolSize 提供了在负载较大时临时增加线程数以处理额外任务的机制。
在构建 ThreadPoolExecutor 时,合理设置 corePoolSize 和 maximumPoolSize 是关键,以确保线程池能够在不同负载下表现出理想的性能。
keepAliveTime
表示非核心线程的空闲超时时间,即当线程池中的线程数大于核心线程数时,keepAliveTime
就是指定这些空闲线程的最大存活时间。workQueue 是 ThreadPoolExecutor 中的一个参数,用于指定任务队列。
线程池的任务队列主要用于存储提交但尚未被执行的任务。用户可以手动传入一个任务队列,
这样可以根据实际需求选择不同的队列实现,以满足特定的场景和性能要求。例如,在某些场景下,对响应时间要求较高,可以选择同步队列;而在某些场景下,
对系统资源的使用有更高的要求,可以选择有界队列或无界队列。手动传入任务队列是为了提供更大的灵活性和定制性。
这个参数允许用户自定义创建新线程的方式,从而可以控制线程的创建过程,包括线程的名字、优先级、守护状态等。
threadFactory 参数是一个实现了 ThreadFactory 接口的对象。ThreadFactory 是一个简单的接口,它只有一个方法:Thread newThread(Runnable r)。当线程池需要创建一个新线程时,会调用这个方法。
线程池的拒绝策略
线程池的任务队列已经满了(工作线程已经忙不过来了)如果又有别人
往里面添加新的任务,怎么办?
Java中的线程池在面临无法接受新任务的情况时,会执行拒绝策略。
拒绝策略定义了在线程池饱和时如何处理新任务的策略。
ThreadPoolExecutor 提供了几种内置的拒绝策略,同时也允许用户自定义拒绝策略。
以下是Java中常见的拒绝策略:
AbortPolicy(默认策略):
RejectedExecutionException
异常。CallerRunsPolicy:
DiscardPolicy:
DiscardOldestPolicy:
用户还可以通过实现 RejectedExecutionHandler 接口来定义自己的拒绝策略。
自定义拒绝策略需要实现 RejectedExecutionHandler接口的 rejectedExecution方法,
该方法定义了任务被拒绝时的处理逻辑。
示例代码:
public class CustomRejectedHandler implements RejectedExecutionHandler {
@Override
public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
// 自定义处理逻辑,例如记录日志、通知等
System.err.println("Task rejected: " + r.toString());
}
}
// 使用自定义拒绝策略
ThreadPoolExecutor executor = new ThreadPoolExecutor(
corePoolSize, // 核心线程数
maximumPoolSize, // 最大线程数
keepAliveTime, // 非核心线程的空闲超时时间
TimeUnit.SECONDS, // 时间单位
workQueue, // 任务队列
new CustomRejectedHandler() // 自定义拒绝策略
);