Java中不能直接用Thread+Callable是因为Thread构造器只接受Runnable,而Callable的call()方法支持返回值和异常,需通过ExecutorService.submit()桥接;使用步骤包括实现Callable、重写call()、创建线程池、submit获取Future、get()获取结果。

Java 中用 Callable 和 Future 可以创建有返回值的线程,核心是借助线程池提交任务,而不是直接 new Thread。
为什么不能直接用 Thread + Callable?
Thread 构造器只接受 Runnable,不支持 Callable。而 Callable 的 call() 方法能抛异常、有返回值,Runnable 的 run() 则不能。所以必须通过 ExecutorService 来桥接。
基本使用步骤
- 写一个类实现
Callable<String>(泛型指定返回类型) - 重写
call()方法,写具体逻辑并 return 结果 - 用
Executors.newFixedThreadPool(1)创建线程池 - 调用
submit()提交任务,得到Future<String> - 用
future.get()获取结果(会阻塞,直到任务完成)
一个完整示例
计算两个数的和,并返回字符串结果:
import java.util.concurrent.*;
public class CallableDemo {
public static void main(String[] args) throws Exception {
ExecutorService pool = Executors.newFixedThreadPool(1);
Callable<String> task = () -> {
Thread.sleep(1000); // 模拟耗时操作
return "Result: " + (20 + 30);
};
Future<String> future = pool.submit(task);
System.out.println("等待结果...");
String result = future.get(); // 阻塞等待
System.out.println(result);
pool.shutdown();
}
}
常用 Future 操作技巧
-
future.isDone():检查任务是否已完成(非阻塞) -
future.get(3, TimeUnit.SECONDS):带超时的获取,超时抛TimeoutException -
future.cancel(true):尝试取消任务,true表示中断正在执行的线程 - 如果任务抛出异常,
get()会包装成ExecutionException抛出,需捕获处理


















