一、介绍
FutureTask类位于java.util.concurrent包中,用于处理并返回异步任务结果。
FutureTask类源码注释:“一个可取消的异步计算。这个类实现了Future的基本方法:开始,取消计算、查询计算是否结束、返回计算结果。计算结果只能在计算结束的时候返回;如果计算尚未结束,get方法就会阻塞等待。一旦计算完毕,就不能取消或重启计算。”
最关键的一句就是,它的get方法会等到计算完毕才返回结果,非常适合用来将大的计算任务拆分成一个个独立的小的计算任务,用几个线程同时计算小任务,最终返回并叠加出大任务的结果。
二、简单的例子
假设要计算20万以内的和,除了暴力法,还可以将其分成4份:1-50000、50000-100000…的和运算,除去开启线程的成本,理想情况下,用时减少为原来的1/4。
首先,我们创建一个继承Callable类的类(SegmentTask),实现call方法,用于本区间的计算:
public class SegmentTask implements Callable<Integer> {
//第几分段
private int order;
//要求小于n,现在要求小于20万
private int n;
//总共有几个分段
private int p;
public SegmentTask(int order, int n, int p) {
this.order = order;
this.n = n;
this.p = p;
}
@Ove