[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"$f1b300lqgtfmoj":3,"$f250wz8h39yydc":8,"$f3e13fn86h0z0l":29,"$f1tmzc20p7l0cb":37,"$f2jp4ujtau52ca":72,"toc--532400512-5-5":76},{"description":4,"domain":5,"id":6,"keywords":4,"title":7},"","api.kongjs.com",1,"默认",[9,20,24],{"children":10,"icon":4,"id":11,"linkType":12,"linkUrl":13,"parentId":14,"sort":15,"status":16,"target":17,"title":18,"visible":19},null,"447369447469600768","URL","\u002F","0",0,"1","_self","首页",true,{"children":10,"icon":4,"id":21,"linkType":12,"linkUrl":22,"parentId":14,"sort":15,"status":16,"target":17,"title":23,"visible":19},"447369693859794944","\u002Fnotes","笔记",{"children":10,"icon":4,"id":25,"linkType":26,"linkUrl":27,"parentId":14,"sort":15,"status":16,"target":17,"title":28,"visible":19},"447369977960976384","PAGE","\u002Fabout","关于我",{"category":30,"categoryId":31,"cover":10,"description":4,"fileId":10,"id":34,"publishAt":10,"tags":35,"title":36},{"articleCount":10,"children":10,"cover":10,"description":4,"fileId":10,"icon":4,"id":31,"parentId":14,"slug":32,"sort":15,"title":33},"453164732518506496","back-end","后端","453165633773772800",[],"Java面试核心知识",[38,41,44,48,52,56,60,64,68],{"children":10,"description":4,"id":39,"noteId":34,"parentId":14,"sort":15,"status":16,"title":40},"453165775620939776","Java基础核心全集（数据类型、拆箱装箱、克隆、对象结构、字符串、包装类、序列化）",{"children":10,"description":4,"id":42,"noteId":34,"parentId":14,"sort":6,"status":16,"title":43},"453166088570544128","JVM原理（JDK8~25）内存结构、分代模型、GC算法、垃圾收集器、元空间、双亲委派机制",{"children":10,"description":4,"id":45,"noteId":34,"parentId":14,"sort":46,"status":16,"title":47},"453166295265845248",2,"Java8至25 对象创建全过程及各版本底层演进差异",{"children":10,"description":4,"id":49,"noteId":34,"parentId":14,"sort":50,"status":16,"title":51},"453166545573519360",3,"Java集合全套原理（List+Map底层、扩容机制、线程安全集合对比）",{"children":10,"description":4,"id":53,"noteId":34,"parentId":14,"sort":54,"status":16,"title":55},"453166809651093504",4,"Java线程原理、六大状态流转、线程结束判断、安全中断、核心方法区别",{"children":10,"description":4,"id":57,"noteId":34,"parentId":14,"sort":58,"status":16,"title":59},"453167023724175360",5,"Java线程池原理、使用规范、常用并发异步工具类",{"children":10,"description":4,"id":61,"noteId":34,"parentId":14,"sort":62,"status":16,"title":63},"453167209447956480",6,"Java 虚拟线程与平台线程：原理、区别与实战使用",{"children":10,"description":4,"id":65,"noteId":34,"parentId":14,"sort":66,"status":16,"title":67},"453167452423987200",7,"CAS与AQS 底层原理、核心流程、面试最全详解",{"children":10,"description":4,"id":69,"noteId":34,"parentId":14,"sort":70,"status":16,"title":71},"453168570885480448",8,"线上服务器CPU飙升 Java代码 完整定位排查流程",{"content":73,"contentType":74,"description":4,"title":59,"wordCount":75},"# Java线程池原理、使用规范、常用并发异步工具类\n\n本文全覆盖：**线程池核心原理、七大参数详解、工作机制、拒绝策略、内置线程池弊端、生产自定义线程池、线程池复用原理、四大并发异步工具类**，解决线程池95%面试和线上问题，逻辑闭环、可直接背诵。\n\n## 一、线程池核心原理（为什么用线程池）\n\n### 1\\. 原生new Thread的弊端\n\n- 频繁创建、销毁线程，开销极大（OS内核线程创建成本高）\n\n- 无限制创建线程，导致**线程泛滥、上下文切换爆炸、OOM**\n\n- 缺乏统一管理、任务排队机制\n\n### 2\\. 线程池核心作用\n\n**线程复用、控制并发、统一管理、降低开销**\n\n- 复用线程：线程创建一次，循环处理任务，避免频繁销毁创建\n\n- 限流保护：控制最大并发线程数，保护服务器CPU、内存资源\n\n- 任务队列缓冲：削峰填谷，应对突发流量\n\n- 可监控、可拒绝、可优雅关闭\n\n## 二、线程池七大核心参数（面试必考）\n\nThreadPoolExecutor 完整构造器7个参数，是线程池底层核心\n\n1. **corePoolSize 核心线程数**：常驻线程，不会被超时回收\n\n2. **maximumPoolSize 最大线程数**：线程池允许的最大并发线程数量\n\n3. **keepAliveTime 空闲超时时间**：非核心线程空闲超时后被回收\n\n4. **unit 时间单位**：配合超时时间使用\n\n5. **workQueue 任务阻塞队列**：存放等待执行的任务\n\n6. **threadFactory 线程工厂**：创建线程，自定义线程名、优先级、守护线程\n\n7. **handler 拒绝策略**：任务满负荷后，新任务的处理策略\n\n## 三、线程池完整工作流程（满分背诵）\n\n**任务提交执行顺序：核心线程 → 队列 → 最大线程 → 拒绝策略**\n\n1. 提交任务，判断**当前线程数 \\\u003C 核心线程数**：新建核心线程执行任务\n\n2. 核心线程已满，判断**队列是否未满**：任务放入阻塞队列排队\n\n3. 队列已满，判断**当前线程数 \\\u003C 最大线程数**：新建非核心线程执行任务\n\n4. 达到最大线程数 \\+ 队列已满：触发**拒绝策略**\n\n5. 非核心线程空闲超过 keepAliveTime：自动回收，节省资源\n\n## 四、四大拒绝策略（JDK内置）\n\n1. **AbortPolicy（默认）**：直接抛出异常，中断任务，生产不推荐\n\n2. **CallerRunsPolicy**：谁提交谁执行（主线程自己跑），不抛异常、不丢任务，**生产最稳**\n\n3. **DiscardPolicy**：直接丢弃当前新任务，无日志、无异常，风险高\n\n4. **DiscardOldestPolicy**：丢弃队列最老任务，执行新任务，适合实时性任务\n\n## 五、四种内置线程池 \\& 致命弊端（阿里规范）\n\n**生产禁止使用 Executors 内置线程池！全部存在隐患**\n\n### 1\\. FixedThreadPool（固定线程池）\n\n- 核心线程=最大线程，无空闲回收\n\n- **弊端**：队列是无界队列 LinkedBlockingQueue，任务无限堆积 → **OOM**\n\n### 2\\. CachedThreadPool（缓存线程池）\n\n- 核心线程0，最大线程Integer\\.MAX\\_VALUE\n\n- **弊端**：线程无限创建 → **线程泛滥、CPU打满、OOM**\n\n### 3\\. SingleThreadExecutor（单线程池）\n\n- 单个线程串行执行\n\n- **弊端**：无界队列，任务堆积OOM\n\n### 4\\. ScheduledThreadPool（定时线程池）\n\n- 支持定时、周期任务\n\n- **弊端**：最大线程数无限，高并发线程爆炸\n\n## 六、生产环境正确使用方式（必背）\n\n**手动自定义 ThreadPoolExecutor \\+ 有界队列 \\+ 自定义线程名 \\+ 合理拒绝策略**\n\n- 队列必须使用 **有界队列**（如ArrayBlockingQueue），限制任务数量，防止OOM\n\n- 自定义线程工厂，设置线程名称，方便线上排查堆栈\n\n- 拒绝策略优先使用 CallerRunsPolicy，保证不丢任务、不抛异常雪崩\n\n- 根据业务IO密集\u002FCPU密集配置参数\n\n### 参数配置经验值\n\n- **CPU密集型**：核心线程数 = CPU核心数 \\+ 1（减少上下文切换）\n\n- **IO密集型**：核心线程数 = CPU核心数 \\* 2 或 20–50（等待IO，可多开线程）\n\n## 七、线程池核心拓展知识点\n\n### 1\\. 线程池线程复用原理\n\n线程启动后不会退出，底层通过 **while死循环 \\+ 队列take\\(\\)** 不断阻塞获取新任务，实现线程永久复用，只有线程超时\u002F关闭才会退出。\n\n### 2\\. 核心线程会不会回收？\n\n默认不会。可通过 `allowCoreThreadTimeOut(true)` 开启核心线程超时回收，极致节省资源。\n\n### 3\\. 线程池关闭方式\n\n- **shutdown\\(\\)**：平缓关闭，停止接收新任务，执行完队列剩余任务\n\n- **shutdownNow\\(\\)**：强制关闭，尝试中断正在执行任务，清空队列\n\n---\n\n## 八、Java 四大常用并发\u002F异步工具类（面试高频）\n\n### 1\\. CompletableFuture（JDK8 异步编程神器）\n\n**解决问题**：替代 Future，解决回调地狱、无法链式编程、获取结果阻塞问题，实现**全异步链式编程**。\n\n#### 核心能力\n\n- 异步执行任务、非阻塞获取结果\n\n- 链式调用：thenApply、thenAccept、thenRun\n\n- 多任务组合：allOf（全部完成）、anyOf（任意一个完成）\n\n- 异常优雅捕获\n\n#### 适用场景\n\n多接口并行查询、复杂异步编排、微服务多接口聚合、批量异步处理\n\n### 2\\. CountDownLatch（倒计时计数器）\n\n**核心作用**：**一个线程等待多个线程执行完毕**，一次性使用、不可重置。\n\n#### 原理\n\n- 构造传入总次数count\n\n- 子线程执行完调用 countDown\\(\\) 计数器\\-1\n\n- 主线程 await\\(\\) 阻塞，直到count=0唤醒\n\n#### 场景\n\n多线程批量任务、并行处理后汇总结果\n\n### 3\\. CyclicBarrier（循环栅栏）\n\n**核心作用**：**多个线程互相等待，全部到位再统一执行**，可循环复用。\n\n#### 区别CountDownLatch\n\n- CountDownLatch：**主线等子线程**，一次性\n\n- CyclicBarrier：**子线程互相等**，可循环复用\n\n#### 场景\n\n多阶段分批任务、多人组队同步执行、循环批量处理\n\n### 4\\. Semaphore（信号量）\n\n**核心作用**：**控制并发限流**，限制同时执行的线程数量\n\n#### 原理\n\n- permits 许可数 = 最大并发数\n\n- acquire\\(\\) 获取许可，没有则阻塞\n\n- release\\(\\) 释放许可\n\n#### 场景\n\n接口限流、数据库连接限流、第三方接口调用限流、秒杀并发控制\n\n---\n\n## 九、四大并发工具类终极对比（背诵版）\n\n- **CountDownLatch**：倒计时，主线等子线程，一次性\n\n- **CyclicBarrier**：栅栏等待，线程互相等，可循环\n\n- **Semaphore**：并发限流，控制同时运行线程数\n\n- **CompletableFuture**：异步任务编排、多任务组合、链式异步编程\n\n## 十、面试终极总结（直接背诵）\n\n线程池通过线程复用降低创建销毁开销，通过七大参数控制并发与排队；工作流程遵循**核心线程→队列→最大线程→拒绝策略**。禁止使用JDK内置线程池，必须自定义有界队列线程池防止OOM。并发工具中，CountDownLatch用于批量等待、CyclicBarrier用于循环同步、Semaphore用于限流、CompletableFuture用于异步任务编排。","markdown",3470,{"frontmatter":77,"meta":78,"nodes":183},{},{"title":59,"description":79,"toc":80},"本文全覆盖：线程池核心原理、七大参数详解、工作机制、拒绝策略、内置线程池弊端、生产自定义线程池、线程池复用原理、四大并发异步工具类，解决线程池95%面试和线上问题，逻辑闭环、可直接背诵。",{"title":4,"searchDepth":58,"depth":58,"links":81},[82,91,94,97,100,116,123,136,177,180],{"id":4,"depth":46,"text":83,"children":84},"一、线程池核心原理（为什么用线程池）",[85,88],{"id":86,"depth":50,"text":87},"-_1-new-thread","1. 原生new Thread的弊端",{"id":89,"depth":50,"text":90},"-_2","2. 线程池核心作用",{"id":92,"depth":46,"text":93},"-1","二、线程池七大核心参数（面试必考）",{"id":95,"depth":46,"text":96},"-2","三、线程池完整工作流程（满分背诵）",{"id":98,"depth":46,"text":99},"jdk","四、四大拒绝策略（JDK内置）",{"id":101,"depth":46,"text":102,"children":103},"-3","五、四种内置线程池 & 致命弊端（阿里规范）",[104,107,110,113],{"id":105,"depth":50,"text":106},"-_1-fixedthreadpool","1. FixedThreadPool（固定线程池）",{"id":108,"depth":50,"text":109},"-_2-cachedthreadpool","2. CachedThreadPool（缓存线程池）",{"id":111,"depth":50,"text":112},"-_3-singlethreadexecutor","3. SingleThreadExecutor（单线程池）",{"id":114,"depth":50,"text":115},"-_4-scheduledthreadpool","4. ScheduledThreadPool（定时线程池）",{"id":117,"depth":46,"text":118,"children":119},"-4","六、生产环境正确使用方式（必背）",[120],{"id":121,"depth":50,"text":122},"-","参数配置经验值",{"id":124,"depth":46,"text":125,"children":126},"-5","七、线程池核心拓展知识点",[127,130,133],{"id":128,"depth":50,"text":129},"-_1","1. 线程池线程复用原理",{"id":131,"depth":50,"text":132},"-_2-1","2. 核心线程会不会回收？",{"id":134,"depth":50,"text":135},"-_3","3. 线程池关闭方式",{"id":137,"depth":46,"text":138,"children":139},"java-1","八、Java 四大常用并发\u002F异步工具类（面试高频）",[140,150,160,169],{"id":141,"depth":50,"text":142,"children":143},"java-_1-completablefuturejdk8","1. CompletableFuture（JDK8 异步编程神器）",[144,147],{"id":145,"depth":54,"text":146},"java-_1-completablefuturejdk8-","核心能力",{"id":148,"depth":54,"text":149},"java-_1-completablefuturejdk8--1","适用场景",{"id":151,"depth":50,"text":152,"children":153},"java-_2-countdownlatch","2. CountDownLatch（倒计时计数器）",[154,157],{"id":155,"depth":54,"text":156},"java-_2-countdownlatch-","原理",{"id":158,"depth":54,"text":159},"java-_2-countdownlatch--1","场景",{"id":161,"depth":50,"text":162,"children":163},"java-_3-cyclicbarrier","3. CyclicBarrier（循环栅栏）",[164,167],{"id":165,"depth":54,"text":166},"java-_3-cyclicbarrier-countdownlatch","区别CountDownLatch",{"id":168,"depth":54,"text":159},"java-_3-cyclicbarrier-",{"id":170,"depth":50,"text":171,"children":172},"java-_4-semaphore","4. Semaphore（信号量）",[173,175],{"id":174,"depth":54,"text":156},"java-_4-semaphore-",{"id":176,"depth":54,"text":159},"java-_4-semaphore--1",{"id":178,"depth":46,"text":179},"-6","九、四大并发工具类终极对比（背诵版）",{"id":181,"depth":46,"text":182},"-7","十、面试终极总结（直接背诵）",[184,188,197,200,203,219,221,226,240,242,245,290,292,297,329,331,360,362,367,369,383,385,398,400,410,412,422,424,429,447,449,463,465,467,474,476,484,486,500,503,505,507,517,520,534,536,539,541,551,553,564,566,569,571,579,581,597,599,602,604,612,614,625,627,630,632,634,660,662],[185,186,59],"h1",{"id":187},"java",[189,190,191,192,196],"p",{},"本文全覆盖：",[193,194,195],"strong",{},"线程池核心原理、七大参数详解、工作机制、拒绝策略、内置线程池弊端、生产自定义线程池、线程池复用原理、四大并发异步工具类","，解决线程池95%面试和线上问题，逻辑闭环、可直接背诵。",[198,199,83],"h2",{"id":4},[201,202,87],"h3",{"id":86},[204,205,206,210,216],"ul",{},[207,208,209],"li",{},"频繁创建、销毁线程，开销极大（OS内核线程创建成本高）",[207,211,212,213],{},"无限制创建线程，导致",[193,214,215],{},"线程泛滥、上下文切换爆炸、OOM",[207,217,218],{},"缺乏统一管理、任务排队机制",[201,220,90],{"id":89},[189,222,223],{},[193,224,225],{},"线程复用、控制并发、统一管理、降低开销",[204,227,228,231,234,237],{},[207,229,230],{},"复用线程：线程创建一次，循环处理任务，避免频繁销毁创建",[207,232,233],{},"限流保护：控制最大并发线程数，保护服务器CPU、内存资源",[207,235,236],{},"任务队列缓冲：削峰填谷，应对突发流量",[207,238,239],{},"可监控、可拒绝、可优雅关闭",[198,241,93],{"id":92},[189,243,244],{},"ThreadPoolExecutor 完整构造器7个参数，是线程池底层核心",[246,247,248,254,260,266,272,278,284],"ol",{},[207,249,250,253],{},[193,251,252],{},"corePoolSize 核心线程数","：常驻线程，不会被超时回收",[207,255,256,259],{},[193,257,258],{},"maximumPoolSize 最大线程数","：线程池允许的最大并发线程数量",[207,261,262,265],{},[193,263,264],{},"keepAliveTime 空闲超时时间","：非核心线程空闲超时后被回收",[207,267,268,271],{},[193,269,270],{},"unit 时间单位","：配合超时时间使用",[207,273,274,277],{},[193,275,276],{},"workQueue 任务阻塞队列","：存放等待执行的任务",[207,279,280,283],{},[193,281,282],{},"threadFactory 线程工厂","：创建线程，自定义线程名、优先级、守护线程",[207,285,286,289],{},[193,287,288],{},"handler 拒绝策略","：任务满负荷后，新任务的处理策略",[198,291,96],{"id":95},[189,293,294],{},[193,295,296],{},"任务提交执行顺序：核心线程 → 队列 → 最大线程 → 拒绝策略",[246,298,299,306,313,320,326],{},[207,300,301,302,305],{},"提交任务，判断",[193,303,304],{},"当前线程数 \u003C 核心线程数","：新建核心线程执行任务",[207,307,308,309,312],{},"核心线程已满，判断",[193,310,311],{},"队列是否未满","：任务放入阻塞队列排队",[207,314,315,316,319],{},"队列已满，判断",[193,317,318],{},"当前线程数 \u003C 最大线程数","：新建非核心线程执行任务",[207,321,322,323],{},"达到最大线程数 + 队列已满：触发",[193,324,325],{},"拒绝策略",[207,327,328],{},"非核心线程空闲超过 keepAliveTime：自动回收，节省资源",[198,330,99],{"id":98},[246,332,333,339,348,354],{},[207,334,335,338],{},[193,336,337],{},"AbortPolicy（默认）","：直接抛出异常，中断任务，生产不推荐",[207,340,341,344,345],{},[193,342,343],{},"CallerRunsPolicy","：谁提交谁执行（主线程自己跑），不抛异常、不丢任务，",[193,346,347],{},"生产最稳",[207,349,350,353],{},[193,351,352],{},"DiscardPolicy","：直接丢弃当前新任务，无日志、无异常，风险高",[207,355,356,359],{},[193,357,358],{},"DiscardOldestPolicy","：丢弃队列最老任务，执行新任务，适合实时性任务",[198,361,102],{"id":101},[189,363,364],{},[193,365,366],{},"生产禁止使用 Executors 内置线程池！全部存在隐患",[201,368,106],{"id":105},[204,370,371,374],{},[207,372,373],{},"核心线程=最大线程，无空闲回收",[207,375,376,379,380],{},[193,377,378],{},"弊端","：队列是无界队列 LinkedBlockingQueue，任务无限堆积 → ",[193,381,382],{},"OOM",[201,384,109],{"id":108},[204,386,387,390],{},[207,388,389],{},"核心线程0，最大线程Integer.MAX_VALUE",[207,391,392,394,395],{},[193,393,378],{},"：线程无限创建 → ",[193,396,397],{},"线程泛滥、CPU打满、OOM",[201,399,112],{"id":111},[204,401,402,405],{},[207,403,404],{},"单个线程串行执行",[207,406,407,409],{},[193,408,378],{},"：无界队列，任务堆积OOM",[201,411,115],{"id":114},[204,413,414,417],{},[207,415,416],{},"支持定时、周期任务",[207,418,419,421],{},[193,420,378],{},"：最大线程数无限，高并发线程爆炸",[198,423,118],{"id":117},[189,425,426],{},[193,427,428],{},"手动自定义 ThreadPoolExecutor + 有界队列 + 自定义线程名 + 合理拒绝策略",[204,430,431,438,441,444],{},[207,432,433,434,437],{},"队列必须使用 ",[193,435,436],{},"有界队列","（如ArrayBlockingQueue），限制任务数量，防止OOM",[207,439,440],{},"自定义线程工厂，设置线程名称，方便线上排查堆栈",[207,442,443],{},"拒绝策略优先使用 CallerRunsPolicy，保证不丢任务、不抛异常雪崩",[207,445,446],{},"根据业务IO密集\u002FCPU密集配置参数",[201,448,122],{"id":121},[204,450,451,457],{},[207,452,453,456],{},[193,454,455],{},"CPU密集型","：核心线程数 = CPU核心数 + 1（减少上下文切换）",[207,458,459,462],{},[193,460,461],{},"IO密集型","：核心线程数 = CPU核心数 * 2 或 20–50（等待IO，可多开线程）",[198,464,125],{"id":124},[201,466,129],{"id":128},[189,468,469,470,473],{},"线程启动后不会退出，底层通过 ",[193,471,472],{},"while死循环 + 队列take()"," 不断阻塞获取新任务，实现线程永久复用，只有线程超时\u002F关闭才会退出。",[201,475,132],{"id":131},[189,477,478,479,483],{},"默认不会。可通过 ",[480,481,482],"code",{},"allowCoreThreadTimeOut(true)"," 开启核心线程超时回收，极致节省资源。",[201,485,135],{"id":134},[204,487,488,494],{},[207,489,490,493],{},[193,491,492],{},"shutdown()","：平缓关闭，停止接收新任务，执行完队列剩余任务",[207,495,496,499],{},[193,497,498],{},"shutdownNow()","：强制关闭，尝试中断正在执行任务，清空队列",[501,502],"hr",{},[198,504,138],{"id":137},[201,506,142],{"id":141},[189,508,509,512,513,516],{},[193,510,511],{},"解决问题","：替代 Future，解决回调地狱、无法链式编程、获取结果阻塞问题，实现",[193,514,515],{},"全异步链式编程","。",[518,519,146],"h4",{"id":145},[204,521,522,525,528,531],{},[207,523,524],{},"异步执行任务、非阻塞获取结果",[207,526,527],{},"链式调用：thenApply、thenAccept、thenRun",[207,529,530],{},"多任务组合：allOf（全部完成）、anyOf（任意一个完成）",[207,532,533],{},"异常优雅捕获",[518,535,149],{"id":148},[189,537,538],{},"多接口并行查询、复杂异步编排、微服务多接口聚合、批量异步处理",[201,540,152],{"id":151},[189,542,543,546,547,550],{},[193,544,545],{},"核心作用","：",[193,548,549],{},"一个线程等待多个线程执行完毕","，一次性使用、不可重置。",[518,552,156],{"id":155},[204,554,555,558,561],{},[207,556,557],{},"构造传入总次数count",[207,559,560],{},"子线程执行完调用 countDown() 计数器-1",[207,562,563],{},"主线程 await() 阻塞，直到count=0唤醒",[518,565,159],{"id":158},[189,567,568],{},"多线程批量任务、并行处理后汇总结果",[201,570,162],{"id":161},[189,572,573,546,575,578],{},[193,574,545],{},[193,576,577],{},"多个线程互相等待，全部到位再统一执行","，可循环复用。",[518,580,166],{"id":165},[204,582,583,590],{},[207,584,585,586,589],{},"CountDownLatch：",[193,587,588],{},"主线等子线程","，一次性",[207,591,592,593,596],{},"CyclicBarrier：",[193,594,595],{},"子线程互相等","，可循环复用",[518,598,159],{"id":168},[189,600,601],{},"多阶段分批任务、多人组队同步执行、循环批量处理",[201,603,171],{"id":170},[189,605,606,546,608,611],{},[193,607,545],{},[193,609,610],{},"控制并发限流","，限制同时执行的线程数量",[518,613,156],{"id":174},[204,615,616,619,622],{},[207,617,618],{},"permits 许可数 = 最大并发数",[207,620,621],{},"acquire() 获取许可，没有则阻塞",[207,623,624],{},"release() 释放许可",[518,626,159],{"id":176},[189,628,629],{},"接口限流、数据库连接限流、第三方接口调用限流、秒杀并发控制",[501,631],{},[198,633,179],{"id":178},[204,635,636,642,648,654],{},[207,637,638,641],{},[193,639,640],{},"CountDownLatch","：倒计时，主线等子线程，一次性",[207,643,644,647],{},[193,645,646],{},"CyclicBarrier","：栅栏等待，线程互相等，可循环",[207,649,650,653],{},[193,651,652],{},"Semaphore","：并发限流，控制同时运行线程数",[207,655,656,659],{},[193,657,658],{},"CompletableFuture","：异步任务编排、多任务组合、链式异步编程",[198,661,182],{"id":181},[189,663,664,665,668],{},"线程池通过线程复用降低创建销毁开销，通过七大参数控制并发与排队；工作流程遵循",[193,666,667],{},"核心线程→队列→最大线程→拒绝策略","。禁止使用JDK内置线程池，必须自定义有界队列线程池防止OOM。并发工具中，CountDownLatch用于批量等待、CyclicBarrier用于循环同步、Semaphore用于限流、CompletableFuture用于异步任务编排。"]