十五、Java并发 Java Java.util.concurrent.Future
写了几篇 Java 一文秒懂 XXX 系列的文章后,对 Java 并发编程的设计思想真的是竖然起敬。
Future 定义在 java.util.concurrent 包中,这是一个接口,自 Java 1.5 以来一直存在的接口,用于处理异步调用和处理并发编程。
创建 Future
简单地说,Future 类表示异步计算的未来结果 – 在处理完成后最终将出现在 Future 中的结果。
是不是又很难理解,文字越少,内容越多。上面这句话的意思,就是主线程会创建一个 Future 接口的对象,然后启动并发线程,并告诉并发线程,一旦你执行完毕,就把结果存储在这个 Future 对象里。
因此,理解 Future 的第一步,就是要知道如何创建和返回 Future 实例。
一般情况下,我们会把长时间运行的逻辑放在异步线程中进行处理,这是使用 Future 接口最理想的场景。主线程只要简单的将异步任务封装在 Future 里,然后开始等待 Future 的完成,在这段等待的时间内,可以处理一些其它逻辑,一旦 Future 执行完毕,就可以从中获取执行的结果并进一步处理。
针对上面这种表述,我们来看看具体哪些场景可以使用 Future :
- 计算密集型( 数学和科学计算 )
- 操纵大数据结构( 大数据 )
- 远程方法调用(下载文件,HTML 爬取,Web 服务)
实现了 Future 的 FutureTask
我们先来看一段代码:
public class SquareCalculator {
private ExecutorService executor
= Executors.newSingleThreadExecutor();
public Future<Integer> calculate(Integer input) {
return executor.submit(() -> {
Thread.sleep(1000);
return input * input;
});
}
如果你认真读过前几个章节,想必对这段代码不陌生了。
在上面这段代码中,我们创建了一个简单的类用于计算一个整型 ( Integer ) 的平方。当然了,计算平方这个任务肯定不能划到 「 长时间运行 」 这个类别里,所以我们在它之前又添加了 Thread.sleep(1000)。