关键在于用 CompletableFuture 替代手动线程管理:用 supplyAsync/runAsync 启动异步任务,按 CPU/IO 密集型配置专用线程池,通过 thenApply/thenCombine/allOf 等组合方法表达任务依赖与聚合,并以内聚方式处理异常。

Java 中线程创建本身已不是重点,真正升级任务模型的关键在于:**用 CompletableFuture 替代手动管理线程的模式,把“创建线程”这件事交给它自动调度,并聚焦于任务逻辑编排与依赖表达**。
用 supplyAsync / runAsync 代替 new Thread
不再写 new Thread(() -> {...}).start() 或手动提交到线程池。直接用静态工厂方法启动异步任务:
-
有返回值:用
CompletableFuture.supplyAsync(() -> doWork())—— 内部默认使用 ForkJoinPool.commonPool(),适合轻量计算 -
无返回值:用
CompletableFuture.runAsync(() -> log("done")) -
指定线程池:显式传入自定义 Executor,比如
supplyAsync(() -> dbQuery(), customPool),避免挤占公共池资源
按任务类型选配线程池,不复用默认池
ForkJoinPool.commonPool() 不适合 IO 或长耗时操作。升级任务模型必须区分场景:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
-
CPU 密集型(如数据转换、加解密):线程数设为
Runtime.getRuntime().availableProcessors() + 1 - IO 密集型(如数据库查询、HTTP 调用):线程数可设为 CPU 核数的 2–4 倍,配合队列缓冲突发请求
- 生产环境务必单例化线程池,避免每次调用都新建,防止资源泄漏和 GC 压力
用组合方法替代手写线程协作逻辑
原来靠 thread1.join()、CountDownLatch 或 wait/notify 实现的等待与协同,现在用 CompletableFuture 的链式方法表达:
立即学习“Java免费学习笔记(深入)”;
-
串行依赖:用
thenApply(同步转换)、thenCompose(扁平化嵌套异步) -
并行合并:用
thenCombine(两个结果合并)、thenAcceptBoth(双任务完成即消费) -
多任务聚合:用
CompletableFuture.allOf()(无返回值聚合)或CompletableFuture.allOf(...).thenApply(v -> collectResults())(需收集结果时)
异常处理内聚进任务流,不抛到主线程外
不再靠 try-catch 包裹线程体,而是把错误响应作为流程一环:
-
捕获并兜底:用
exceptionally(ex -> "fallback")返回默认值 -
统一处理+重试:用
handle((result, ex) -> { if (ex != null) return retry(); else return result; }) -
记录但不中断:用
whenComplete((r, ex) -> logIfError(ex)),不影响后续链路

















