一、摘要
在前几篇线程系列文章中,我们介绍了线程池的相关技术,任务执行类只需要实现Runnable
接口,然后交给线程池,就可以轻松的实现异步执行多个任务的目标,提升程序的执行效率,比如如下异步执行任务下载。
// 创建一个线程池
ExecutorService executor = Executors.newFixedThreadPool(2);
// 提交任务
executor.submit(new Runnable() {
@Override
public void run() {
// 执行下载某文件任务
System.out.println("执行下载某文件任务");
}
});
而实际上Runnable
接口并不能满足所有的需求,比如有些场景下,我们想要获取任务执行的返回结果,Runnable
接口因为无返回值,只能想办法通过额外的方式来写入和读取,操作起来十分不便。
因此,从 JDK 1.5 开始,Java 标准库提供了一个Callable
接口,与Runnable
接口相比,它的方法上多了一个返回值;同时Callable
是一个泛型接口,可以返回指定类型的结果,比如如下的实现类!
public class Task implements Callable<String> {
@Override
public String call() throws Exception {
// 执行下载某文件任务
System.out.println("执行下载某文件任务");
return "xxx";
}
}
问题来了,如何获取异步执行的结果呢?
在 JDK 1.5 中,Java 标准库还提供了一个Future
接口,它可以用来获取异步执行的结果。
下面我们一起来了解一下这个Future
接口!