Java线程池完全指南:参数、队列、拒绝策略及实战

自定义线程池的拒绝策略投递MQ队列 目录一、简介1.1 线程池的参数解释1.2 线程池工作流程1.3 线程池的四种拒绝策略二、代码实现2.1 实现Runnable接口2.2 创建线程池2.3 使用线程池三、测试 一、简介 在我们使用线程池的过程中,经常会遇到超出线程池的缓存队列、超出的最大线程数,这个时候,如果使用的是默认的拒绝策略即直接抛出异常,此时我们的数据就被丢弃了,程序会停止,我们也不知道,因为程序是并发执行的,如果使用了try catch 捕获异常让程序继续执行,但是被拒绝的线程数据已经被丢弃了,今天我们来学习通过自定义线程池的拒绝 阅读详情

Java线程池完全指南:参数、队列、拒绝策略及实战

一、线程池核心参数及作用

线程池的核心实现类ThreadPoolExecutor的构造函数包含7个核心参数,每个参数都直接影响线程池的行为:

public ThreadPoolExecutor(
    int corePoolSize,                  // 核心线程数
    int maximumPoolSize,               // 最大线程数
    long keepAliveTime,                // 非核心线程空闲存活时间
    TimeUnit unit,                     // 时间单位
    BlockingQueue<Runnable> workQueue, // 任务队列
    ThreadFactory threadFactory,       // 线程工厂
    RejectedExecutionHandler handler   // 拒绝策略
)

1. corePoolSize(核心线程数)

  • 作用:线程池长期保持的线程数量,即使线程处于空闲状态也不会被销毁(除非设置了allowCoreThreadTimeOut(true))
  • 行为:新任务提交时,若当前线程数小于核心线程数,会直接创建新线程执行任务,而不是放入队列

2. maximumPoolSize(最大线程数)

  • 作用:线程池允许创建的最大线程数量,是线程数的上限
  • 行为:当队列满且核心线程都在工作时,会创建非核心线程执行任务,直到线程总数达到此值

3. keepAliveTime(空闲存活时间)

  • 作用:控制非核心线程的空闲时间
  • 行为:当非核心线程空闲时间超过此值,会被销毁以释放资源
  • 扩展:通过executor.allowCoreThreadTimeOut(true)可让核心线程也遵守此规则

4. unit(时间单位)

  • 作用:配合keepAliveTime使用,指定时间单位
  • 可选值:TimeUnit.NANOSECONDS、MICROSECONDS、MILLISECONDS、SECONDS等

5. workQueue(任务队列)

  • 作用:核心线程都忙碌时,临时存储新提交的任务
  • 特性:必须是阻塞队列(BlockingQueue),确保线程安全
  • 类型:见下文详细介绍

6. threadFactory(线程工厂)

  • 作用:创建新线程的工厂,用于自定义线程属性
  • 用途:可设置线程名称前缀、优先级、是否为守护线程等,便于调试和监控

7. handler(拒绝策略)

  • 作用:当队列满且线程数达到maximumPoolSize时,对新提交任务的处理策略
  • 内置策略:见下文详细介绍

二、线程池常用队列类型及特性

1. ArrayBlockingQueue(数组阻塞队列)

// 有界队列,容量100,非公平模式(默认)
BlockingQueue<Runnable> queue = new ArrayBlockingQueue<>(100);
// 公平模式(按线程等待顺序处理)
BlockingQueue<Runnable> fairQueue = new ArrayBlockingQueue<>(100, true);
  • 特性:基于数组实现的有界队列,容量固定
  • 优点:内存占用可控,支持公平/非公平调度
  • 缺点:数组结构导致中间元素插入删除效率低
  • 适用场景:任务数量可预测,需要控制内存占用的场景

2. LinkedBlockingQueue(链表阻塞队列)

// 无界队列(默认容量为Integer.MAX_VALUE)
BlockingQueue<Runnable> unboundedQueue = new LinkedBlockingQueue<>();
// 有界队列,容量1000
BlockingQueue<Runnable> boundedQueue = new LinkedBlockingQueue<>(1000);
  • 特性:基于链表实现,可配置为有界或无界
  • 优点:插入删除效率高,并发性能好(读写分离锁)
  • 缺点:无界模式可能导致OOM(内存溢出)
  • 适用场景:任务数量波动大,需要高并发处理的场景

3. SynchronousQueue(同步队列)

BlockingQueue<Runnable> syncQueue = new SynchronousQueue<>();
  • 特性:不存储任务的队列,每个插入操作必须等待对应的移除操作
  • 优点:吞吐量极高,任务直接从生产者传递给消费者
  • 缺点:无法缓冲任务,必须有线程立即处理
  • 适用场景:任务需要立即处理,不允许等待的实时场景

4. PriorityBlockingQueue(优先级队列)

// 任务需实现Comparable接口
BlockingQueue<Runnable> priorityQueue = new PriorityBlockingQueue<>();
// 自定义比较器
BlockingQueue<Runnable> customQueue = new PriorityBlockingQueue<>(11, Comparator.comparingInt(Task::getPriority));
  • 特性:基于二叉堆的无界队列,按优先级排序任务
  • 优点:可按优先级处理任务,高优先级任务先执行
  • 缺点:无界可能导致OOM,同优先级任务顺序不保证
  • 适用场景:任务有明确优先级区分的场景(如VIP任务优先)

5. DelayQueue(延迟队列)

// 任务需实现Delayed接口
BlockingQueue<Delayed> delayQueue = new DelayQueue<>();
  • 特性:存储带延迟时间的任务,只有延迟到期后才能被取出
  • 优点:支持定时/延迟执行任务
  • 缺点:无界可能导致OOM
  • 适用场景:定时任务、延迟重试、缓存过期清理等

三、拒绝策略详解

当线程池的队列已满且线程数达到maximumPoolSize时,新提交的任务会触发拒绝策略。JDK内置4种拒绝策略:

1. AbortPolicy(默认策略)

RejectedExecutionHandler abortHandler = new ThreadPoolExecutor.AbortPolicy();
  • 行为:直接抛出RejectedExecutionException异常
  • 适用场景:需要明确知道任务被拒绝的场景,不允许任务丢失

2. CallerRunsPolicy

RejectedExecutionHandler callerRunsHandler = new ThreadPoolExecutor.CallerRunsPolicy();
  • 行为:由提交任务的线程自己执行该任务
  • 优点:减缓新任务提交速度,给线程池缓冲时间
  • 适用场景:任务提交频率不高,希望尽量处理所有任务的场景

3. DiscardPolicy

RejectedExecutionHandler discardHandler = new ThreadPoolExecutor.DiscardPolicy();
  • 行为:直接丢弃新提交的任务,不抛出异常
  • 适用场景:允许任务丢失的场景,如非核心日志收集

4. DiscardOldestPolicy

RejectedExecutionHandler discardOldestHandler = new ThreadPoolExecutor.DiscardOldestPolicy();
  • 行为:丢弃队列中最旧的任务(队首任务),尝试提交新任务
  • 适用场景:希望新任务能被处理,旧任务可丢弃的场景

5. 自定义拒绝策略

RejectedExecutionHandler customHandler = new RejectedExecutionHandler() {
    @Override
    public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
        // 自定义处理逻辑,如:
        // 1. 将任务持久化到数据库或消息队列
        // 2. 记录日志并告警
        // 3. 降级处理(执行简化版任务)
        System.err.println("任务" + r + "被拒绝,当前队列大小:" + executor.getQueue().size());
    }
};

四、线程池完整使用示例

import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicInteger;

public class ThreadPoolCompleteExample {
    public static void main(String[] args) {
        // 1. 自定义线程工厂
        ThreadFactory threadFactory = new ThreadFactory() {
            private final AtomicInteger threadNum = new AtomicInteger(1);
            
            @Override
            public Thread newThread(Runnable r) {
                Thread thread = new Thread(r, "business-thread-" + threadNum.getAndIncrement());
                thread.setDaemon(false); // 非守护线程
                thread.setPriority(Thread.NORM_PRIORITY);
                return thread;
            }
        };
        
        // 2. 创建任务队列(有界数组队列)
        BlockingQueue<Runnable> workQueue = new ArrayBlockingQueue<>(50);
        
        // 3. 定义拒绝策略
        RejectedExecutionHandler rejectHandler = new ThreadPoolExecutor.CallerRunsPolicy();
        
        // 4. 创建线程池
        ThreadPoolExecutor executor = new ThreadPoolExecutor(
            3,                  // 核心线程数:3
            5,                  // 最大线程数:5
            30,                 // 空闲时间:30秒
            TimeUnit.SECONDS,   // 时间单位:秒
            workQueue,          // 任务队列
            threadFactory,      // 线程工厂
            rejectHandler       // 拒绝策略
        );
        
        // 5. 提交100个任务
        for (int i = 0; i < 100; i++) {
            final int taskId = i;
            executor.execute(() -> {
                try {
                    // 模拟任务执行(0.1秒)
                    Thread.sleep(100);
                    System.out.println("任务" + taskId + "由线程" + 
                        Thread.currentThread().getName() + "完成");
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                }
            });
        }
        
        // 6. 监控线程池状态
        ScheduledExecutorService monitor = Executors.newSingleThreadScheduledExecutor();
        monitor.scheduleAtFixedRate(() -> {
            System.out.println("\n线程池状态:" +
                " 活跃线程数:" + executor.getActiveCount() +
                " 队列大小:" + executor.getQueue().size() +
                " 完成任务数:" + executor.getCompletedTaskCount());
        }, 0, 1, TimeUnit.SECONDS);
        
        // 7. 关闭线程池
        executor.shutdown();
        try {
            // 等待所有任务完成,超时则强制关闭
            if (!executor.awaitTermination(1, TimeUnit.MINUTES)) {
                executor.shutdownNow();
            }
            monitor.shutdown();
        } catch (InterruptedException e) {
            executor.shutdownNow();
            monitor.shutdownNow();
        }
    }
}

五、线程池适用场景

  1. CPU密集型任务

    • 配置:corePoolSize = CPU核心数 + 1,maximumPoolSize = CPU核心数 + 1
    • 队列:ArrayBlockingQueue(有界,容量适中)
    • 示例:数据计算、图像处理
  2. IO密集型任务

    • 配置:corePoolSize = CPU核心数 * 2,maximumPoolSize适当增大
    • 队列:LinkedBlockingQueue(可设置较大容量)
    • 示例:网络请求、文件IO、数据库操作
  3. 实时性要求高的任务

    • 配置:corePoolSize = 0,maximumPoolSize = Integer.MAX_VALUE
    • 队列:SynchronousQueue
    • 示例:实时数据采集、高频交易处理
  4. 优先级任务处理

    • 配置:自定义线程池,核心线程数根据需求设置
    • 队列:PriorityBlockingQueue
    • 示例:客服系统(VIP用户请求优先)、订单处理(加急订单优先)
  5. 定时/延迟任务

    • 配置:使用ScheduledThreadPoolExecutor
    • 队列:内部使用延迟队列
    • 示例:定时备份、订单超时取消、重试机制

六、线程池使用最佳实践

  1. 避免使用Executors工具类

    • newFixedThreadPool()和newSingleThreadExecutor()使用无界队列,可能导致OOM
    • newCachedThreadPool()最大线程数无界,可能创建过多线程导致系统崩溃
  2. 合理设置核心参数

    • 根据任务类型(CPU密集/IO密集)设置核心线程数
    • 优先使用有界队列并合理设置容量,配合合适的拒绝策略
  3. 监控线程池状态

    • 定期监控:活跃线程数、队列大小、完成任务数
    • 关键指标异常时及时告警
  4. 优雅关闭线程池

    • 先调用shutdown(),给任务完成时间
    • 超时后调用shutdownNow()强制关闭
    • 处理shutdownNow()返回的未执行任务
  5. 异常处理

    • execute()提交的任务异常会直接抛出,需在任务内部捕获
    • submit()提交的任务异常会被封装在Future中,需通过get()获取

通过合理配置线程池参数、选择合适的队列和拒绝策略,可以充分发挥线程池的性能优势,同时保证系统的稳定性和可维护性。

实战指南:Qwen3-ASR-1.7B 语音识别 本文介绍了Qwen3-ASR语音识别模型的安装与使用。 阅读详情

相关推荐

Excel地理探测器实战:5分钟搞定空间分异性分析(附完整数据集)

本文详细介绍了如何使用Excel地理探测器插件进行空间分异性分析。通过5分钟实战教程,手把手指导数据格式准备、软件操作及四大探测器(分异及因子、交互作用、风险区、生态探测器)的结果解读,帮助规划师、研究者快速验证地理因素对现象分布的影响,大幅降低GIS分析门槛。

peace的博客 607

java线程池ThreadPoolExecutor类使用详解

在《阿里巴巴java开发手册》中指出了线程资源必须通过线程池提供,不允许在应用中自行显示的创建线程,这样一方面是线程的创建更加规范,可以合理控制开辟线程的数量;另一方面线程的细节管理交给线程池处理,优化了资源的开销。而线程池不允许使用Executors去创建,而要通过ThreadPoolExecutor方式,这一方面是由于jdk中Executor框架虽然提供了如newFixedThrea...

dianyuzhi7625的博客 1423

Python-Opencv中的膨胀和腐蚀

Python-Opencv中的膨胀和腐蚀 腐蚀和膨胀是对白色部分(高亮部分)而言的,不是黑色部分。 膨胀就是图像中的高亮部分进行膨胀,“邻域扩张”,效果图拥有比原图更大的高亮区域。腐蚀就是原图中高亮部分被腐蚀,“邻域被蚕食”,效果图拥有比原图更小的高亮区域。 1.膨胀 膨胀过程是有一个结构元素或者模板去在原图像素比对,当比对过程中,中心像素位置的值根据其八邻域取或运算,或运算为1就取自己的中心值,...

qq_44262417的博客 1万+

阻塞队列&线程池

前言 阻塞队列是线程池的基础。两者都是面试热点,尤其是线程池。所以我特地花时间学习了一下这方面的知识,并做记录。 一.阻塞队列 这个其实用的非常多。安卓里面 Handler机制的MessageQueue,我认为就是一个阻塞队列。 ...

Android小白 1455

ThinkPad X230魔改指南:从博通网卡驱动到1080P屏显全攻略(附Sonoma避坑清单)

本文详细介绍了ThinkPad X230的全面改造方案,包括博通网卡驱动(BCM94352HMB)的安装与调试、1080P屏幕改装技术以及macOS Sonoma系统的适配优化。通过硬件升级和软件调优,使这台经典商务本焕发新生,适合DIY爱好者和技术极客参考实践。

weixin_30379531的博客 584

QT实现HTTP文件(夹)下载的完整流程与实战技巧

本文详细介绍了使用QT框架实现HTTP文件和文件夹下载的完整流程与实战技巧。通过QNetworkAccessManager等核心类,讲解了从单文件下载、大文件处理、进度显示、暂停/取消功能,到复杂的文件夹下载策略。文章重点剖析了断点续传、错误处理与网络健壮性等关键问题,为C++桌面应用集成稳定高效的下载功能提供了专业指导。

weixin_29239279的博客 279

Java线程池和阻塞队列

线程池任务增加过程:注:此图为ThreadPoolExecutor的机制,但不代表全部,比如dubbo提供的线程池 EagerThreadPoolExecutor,就是先起线程到最大值,再进队列 b.拥有六个参数: 比a多了参数: c.拥有六个参数: 比a多了参数: d.拥有七个参数: 但是仔细看的话,ThreadPoolExecutor虽然提供了四个5到7个参数,但是在方法体中,均是 7 个参数。此队列常用方法: 任务队列是基于阻塞队列实现的

纯洁的小魔鬼 4486

无人机避障——卡内基梅隆大学(CMU)CERLAB 无人机自主框架复现

CMUCERLAB无人机自主框架是一个模块化的无人机自主导航系统,包含感知、测绘、规划和控制等组件。安装过程中遇到的主要问题包括:(1)cv_bridge路径未正确识别,需手动指定路径;(2)OpenCV版本冲突(4.2与4.6),导致动态导航节点崩溃。解决方案包括:完全卸载OpenCV4.2,重新编译安装OpenCV4.6,并修改相关CMakeLists文件指定版本。最终成功运行仿真环境,实现无人机在Gazebo和RViz中的自主避障导航功能。

weixin_45390670的博客 1645

Java 理论与实践:线程池与工作队列(from ibm)

线程池有助于实现最佳资源利用率 http://www-900.ibm.com/developerworks/cnBrian Goetz(brian@quiotix.com)首席顾问,Quiotix Corp2002 年 10 月为什么要用线程池?诸如 Web 服务器、数据库服务器、文件服务器或邮件服务器之类的许多服务器应用程序都面向处理来自某些远程来源的大量短小的任务。请求以某种方式到

2294

告别卡顿!用AVPro Video在Unity 2022.3里流畅播放4K视频的保姆级配置流程

本文详细介绍了如何在Unity 2022.3中使用AVPro Video插件实现4K视频的流畅播放。从环境配置、插件选型到核心性能优化技巧,包括解码器设置、内存管理策略和多平台适配方案,帮助开发者彻底解决卡顿问题,提升视频播放体验。

weixin_32349561的博客 318

【Bug已解决】codex: conversation context window exceeded / Token limit reached — CodeX CLI 上下文窗口超限解决方案

CodeX CLI 上下文窗口超限(context_length_exceeded)的解决方案,含开新会话、更大窗口模型、精简提示与限制工具输出。

博客 4180

线程池都有哪几种工作队列

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34033624的博客 1万+

Android14 Qcom 从Framework到Driver带你打开WIFI(二)

上篇文章讲到了UI打开WIFI以后,逐步调用到加载底层驱动以及通知等相关流程。这篇接着上文继续往下看WIFI ON的后续动作。

IAYLBL的博客 766

Java-五种线程池,四种拒绝策略,三类阻塞队列

Java-五种线程池,四种拒绝策略,三种阻塞队列 三种阻塞队列: BlockingQueue&lt;Runnable&gt; workQueue = null; workQueue = new ArrayBlockingQueue&lt;&gt;(5);//基于数组的先进先出队列,有界 workQueue = new LinkedBlockingQueue&lt;&gt;...

草青工作室 的专栏 2万+

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

线程池-四种拒绝策略总结

一、线程池的拒绝策略 线程池中,有三个重要的参数,决定影响了拒绝策略: corePoolSize - 核心线程数,也即最小的线程数。 workQueue - 阻塞队列 。 maximumPoolSize - 最大线程数 当提交任务数大于 corePoolSize 的时候,会优先将任务放到 workQueue 阻塞队列中。当阻塞队列饱和后,会扩充线程池中线程数,直到达到 maximumPoolSize 最大线程数配置。此时,再多余的任务,则会触发线程池的拒绝策略了...

alan_liuyue的博客 4万+

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Java 线程池:7参数配置、4拒绝策略与执行流程详解

Java 线程池是并发编程中的核心组件,能够提高性能、减少资源消耗。本文详解线程池原理、任务执行流程、拒绝策略及优化技巧,助你高效掌握线程池使用。

分享即是最好的学习 3350

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

线程池参数说明及队列拒绝策略

参考 Java.util.concurrent.ThreadPoolExecutor,其构造方法1: public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliv

BlackhorseMe的专栏 7692

任务队列满了怎么办?四种线程池拒绝策略

线程池execute方法作为任务提交的核心入口,其设计体现了生产者-消费者模式与系统健壮性考量。文章深度解析了execute方法的完整实现逻辑,包括参数校验、线程池状态检查、核心线程创建等关键环节,重点剖析了任务队列的容量策略(有界/无界队列)及其影响。特别针对系统过载场景,详细对比了四大拒绝策略(AbortPolicy、CallerRunsPolicy、DiscardPolicy、DiscardOldestPolicy)的特点与适用场景,并展示了自定义拒绝策略的实现方案。文章还探讨了任务包装、优先级支持、

源码获取 | 运行部署 | 定制二开修改,如果回复不及时请耐心等待,请见谅。 1429

线程池的7大参数及4大拒绝策略详解

线程池的7大参数及4大拒绝策略详解

qq_69006278的博客 1494

JAVA 线程池,及7大参数,4大拒绝策略详解

如上图所示,执行顺序为:当提交任务数大于核心线程数时,会优先将任务放到阻塞队列中。当阻塞队列饱和时,会扩充线程池中的线程数,直到达到最大线程数。当任务数超出最大线程数时,就会触发线程池的拒绝策略。/**} /**throw new RejectedExecutionException("任务 " + r . toString() + " 拒绝 from " + e . toString());System . out . println("创建线程:" + r);t < 20。

shxguozhq的博客 1694

线程池八大拒绝策略

拒绝策略特点适用场景调用者线程执行被拒绝的任务,减轻线程池压力。并发量较小且不允许任务丢失的场景,任务执行时间较短。抛出异常,任务提交失败时明确反馈。需要明确处理任务提交失败的场景,适合对任务失败敏感的系统。静默丢弃被拒绝的任务,不抛出异常。对任务丢失不敏感的场景,如日志收集、监控数据等。丢弃队列中最旧的任务,优先处理新提交的任务。需要优先处理新任务的场景,如实时性要求较高的系统。Dubbo记录详细的日志和堆栈信息,帮助快速定位问题,抛出异常。

qq_43539664的博客 1386

Java线程池(ThreadPoolExecutor参数、拒绝策略)详解

方式:实现接口,重写方法。示例@OverrideSystem.out.println("自定义拒绝策略:任务 " + r.toString() + " 被拒绝");理解的参数和拒绝策略对于合理使用线程池至关重要。通过合理设置核心线程数、最大线程数、工作队列和拒绝策略,可以根据不同的业务场景优化线程池的性能,避免资源耗尽和任务堆积等问题。在实际开发中,需要根据具体的需求选择合适的参数和拒绝策略,以确保系统的稳定性和高效性。

dsq_MaDing的博客 887

Java 线程池拒绝策略

Java 线程池拒绝策略

qq_34392295的博客 1595

newfixedthreadpool队列满了_JAVA线程池学习以及队列拒绝策略

为什么要用线程池?在Java中,如果每当一个请求到达就创建一个新线程,开销是相当大的。在实际使用中,每个请求创建新线程的服务器在创建和销毁线程上花费的时间和消耗的系统资源,甚至可能要比花在实际处理实际的用户请求的时间和资源要多的多。除了创建和销毁线程的开销之外,活动的线程也需要消耗系统资源。如果在一个JVM中创建太多的线程,可能会导致系统由于过度消耗内存或者“切换过度”而导致系统资源不足。为了防止...

weixin_39565332的博客 5018

Java六大线程池和四大拒绝策略

Java六大线程池和四大拒绝策略 学习常见的 6 种线程池,并详细讲解 Java 8 新增的 ForkJoinPool 线程池,6 种常见的线程池如下。 FixedThreadPool CachedThreadPool ScheduledThreadPool SingleThreadExecutor SingleThreadScheduledExecutor ForkJoinPool FixedThreadPool 第一种线程池叫作 FixedThreadPool,它的核心线程数

子冉冰清的博客 3283

Java线程池原理与拒绝策略全解析 —— 参数、超时、拒绝机制一网打尽

线程池通过复用线程资源,提升并发性能。核心参数(核心线程数、最大线程数、超时时间、队列长度)决定了线程池的吞吐和稳定性。超时时间(keepAliveTime)能动态回收线程,适应业务波动。拒绝策略是高并发系统不可或缺的安全阀,必须结合业务特点选用。建议结合监控和实际负载持续优化线程池参数。配好参数,选好拒绝策略,线程池才能撑得住高并发!

IT技术学习与工作笔记分享 905
上一篇: jvm实现int i=0;i=i++及字节码文件组成
下一篇: xxl-job学习及与Sharding-JDBC实现分片进行es同步
不见长安在
博客等级 码龄4年 63粉丝 33原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不见长安在

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值