runnable不能直接返回结果,因其run()方法无返回值;需改用callable、用atomicreference/countdownlatch包装,或用futuretask包装runnable并指定默认结果。

Java 中 Runnable 本身没有返回值,所以**不能直接通过它获取结果**。要提交任务并获取结果,必须改用 Callable;但如果你已有 Runnable 实例,可以通过包装方式间接实现。
为什么 Runnable 不能直接返回结果?
Runnable 接口只定义了 run() 方法,无参数、无返回值、不抛受检异常。线程池执行它后,调用方无法拿到任何计算结果。
方案一:改用 Callable(推荐)
把逻辑封装进 Callable,它支持泛型返回值,并可抛异常:
ExecutorService pool = Executors.newFixedThreadPool(2);
Future<string> future = pool.submit(() -> {
Thread.sleep(1000);
return "done";
});
String result = future.get(); // 阻塞等待,获取结果
</string>方案二:用 Runnable + AtomicReference / CountDownLatch 包装
适用于无法修改原有 Runnable 代码的场景。用共享变量暂存结果,配合同步工具确保可见性:
- 使用
AtomicReference存结果,适合单次写入 - 搭配
CountDownLatch等待执行完成
AtomicReference<string> resultRef = new AtomicReference();
CountDownLatch latch = new CountDownLatch(1);
<p>Runnable task = () -> {
try {
Thread.sleep(500);
resultRef.set("task finished");
} finally {
latch.countDown();
}
};</p>
<p>pool.execute(task);
latch.await(); // 等待任务结束
String result = resultRef.get();</p></string>方案三:用 FutureTask 包装 Runnable(带初始值)
FutureTask 构造器支持传入 Runnable 和一个默认结果(result 参数),任务执行完后 get() 就返回该值:
FutureTask<string> futureTask = new FutureTask(
() -> { /* do work */ },
"default-result"
);
pool.execute(futureTask);
String result = futureTask.get(); // 返回 "default-result"
</string>注意:这个“结果”是固定值,不是任务运行中动态计算的 —— 它只在任务正常完成时返回;若任务出错或被取消,则 get() 抛异常。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











