completablefuture.runasync()用于异步执行无返回值任务,需传入runnable;推荐指定自定义线程池避免阻塞公共池;异常需在内部捕获,否则静默丢失;支持thenrun等链式后续操作。

用 CompletableFuture.runAsync() 就能异步执行不带返回值的任务,核心是传入一个 Runnable 实例,它不返回结果、也不抛出受检异常。
基本用法:直接传 Runnable
最简单的写法是传一个 lambda 表达式或方法引用:
CompletableFuture.runAsync(() -> System.out.println("任务在后台线程执行"));-
CompletableFuture.runAsync(this::doSomething);(假设doSomething()是无参无返回 void 方法)
指定线程池:避免阻塞公共 ForkJoinPool
默认使用 ForkJoinPool.commonPool(),但 IO 密集或长耗时任务容易拖慢其他异步操作。推荐显式传入自定义线程池:
ExecutorService executor = Executors.newCachedThreadPool();CompletableFuture.runAsync(() -> readFile(), executor);- 用完记得调用
executor.shutdown()(如需复用可管理生命周期)
处理异常:runAsync 不传播异常,需手动捕获
runAsync 的 Runnable 若抛出异常,会静默丢失(仅打印栈跟踪到 stderr)。必须在 lambda 内部捕获处理:
CompletableFuture.runAsync(() -> {- try { doIoTask(); }
- catch (IOException e) { log.error("IO 失败", e); }
});
后续操作:用 thenRun / thenAccept 等串联
虽然 runAsync 本身无返回值,但返回的 CompletableFuture<void></void> 支持链式响应:
CompletableFuture.runAsync(() -> sendEmail()).thenRun(() -> updateStatus()); // 上一个完成后执行.exceptionally(ex -> { log.error("邮件失败", ex); return null; });
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











