线程池的含义

synchronized (ReindexThreadPoolUtil.class) {
                if (threadPool == null) {
                    threadPool = new ThreadPoolExecutor(
                            1,
                            3,
                            60,
                            TimeUnit.MINUTES,
                            new LinkedBlockingQueue<>(),
                            NAMED_THREAD_FACTORY,
                            new ThreadPoolExecutor.AbortPolicy());
                    threadPool.allowCoreThreadTimeOut(true);
                }
            }

 这段 Java 代码创建了一个线程池,其中 synchronized 用于保证线程安全,确保在多线程环境下只有一个线程能够执行初始化线程池的操作。synchronized (ReindexThreadPoolUtil.class) 使用类的 Class 对象作为锁,这意味着只有当类加载时才会创建这个锁,从而确保了线程安全的初始化。
线程池 ThreadPoolExecutor 的参数含义如下:


1.corePoolSize(1):核心线程数,即线程池始终维护的最小线程数。
2.maximumPoolSize(3):最大线程数,线程池允许的最大并发工作线程数量。
3.keepAliveTime(60):当线程池中的线程数量超过核心线程数时,空闲线程存活的最长时间。
4.unit(TimeUnit.MINUTES):keepAliveTime 的时间单位。
5.workQueue(new LinkedBlockingQueue<>()):工作队列,用于存放待执行的任务。这里使用了无界队列。
6.threadFactory(NAMED_THREAD_FACTORY):线程工厂,用于创建新线程。NAMED_THREAD_FACTORY 应该是一个自定义的线程工厂类,用于给线程命名或者其他定制行为。
7.handler(new ThreadPoolExecutor.AbortPolicy()):拒绝策略,当线程池和工作队列都满时,处理新提交的任务的方式。AbortPolicy 是一种默认的拒绝策略,它会抛出

RejectedExecutionException 异常,中断提交任务的线程。
threadPool.allowCoreThreadTimeOut(true); 表示核心线程也可以超时,当核心线程空闲且超过 keepAliveTime 时,核心线程也会退出。
这段代码创建了一个最小规模为 1,最大规模为 3 的线程池,线程在空闲 60 分钟后会自动关闭。如果线程池和队列都满,且无法接受新任务时,会抛出异常中断提交任务的线程。

ThreadPoolExecutor 的 keepAliveTime 参数是用来设置非核心线程在空闲时等待新任务的最长时间。如果设置为 0,那么一旦线程池中的线程数量超过了核心线程数,多余的线程在完成任务后会立即终止,而不是等待新的任务。然而,你想要的是让线程在执行完当前任务后才结束,这实际上与 keepAliveTime 的概念相反,因为 keepAliveTime 控制的是线程在没有任务时的存活时间。
要达到你的目的,你不需要设置 keepAliveTime,而是应该确保线程池的核心线程数设置得足够大,以便这些线程始终存在,直到所有任务完成。核心线程不会被回收,除非 allowCoreThreadTimeOut 设置为 true 并且超过了 keepAliveTime。
一个简单的线程池配置示例,不考虑 keepAliveTime,而是确保有足够的核心线程来处理任务:

int corePoolSize = 10; // 设置为核心线程数
int maxPoolSize = corePoolSize; // 最大线程数与核心线程数相同,避免扩展
int keepAliveTime = 0; // 设置为0,防止非核心线程空闲后立即终止
TimeUnit unit = TimeUnit.SECONDS; // 时间单位

ThreadPoolExecutor threadPool = new ThreadPoolExecutor(
        corePoolSize,
        maxPoolSize,
        keepAliveTime,
        unit,
        new LinkedBlockingQueue<>(), // 工作队列
        NAMED_THREAD_FACTORY, // 线程工厂
        new ThreadPoolExecutor.AbortPolicy()); // 拒绝策略

// 如果你希望核心线程在空闲时也能超时,可以设置:
threadPool.allowCoreThreadTimeOut(false); // 默认为false,核心线程永不超时

在这种配置下,线程池将始终保持至少 corePoolSize 个线程,即使它们暂时没有工作。这些线程会在完成任务后等待新的任务,而不是立即结束。

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值