FutureTask为可取消的异步计算任务的程序处理。这个异步任务是可以取消的,
。利用开始和取消计算的方法、查询计算是否完成的方法和获取计算结果的方法,此类提供了对 Future 的基本实现。仅在计算完成时才能获取结果;如果计算尚未完成,则阻塞 get 方法。一旦计算完成,就不能再重新开始或取消计算。
可使用 FutureTask 包装 Callable 或 Runnable 对象。因为 FutureTask 实现了 Runnable,所以可将 FutureTask 提交给 Executor 执行。
除了作为一个独立的类外,此类还提供了 protected 功能,这在创建自定义任务类时可能很有用。
这个JDK官方手册的解释,至于FutureTask提供哪些方法请自行查看API.
下面根据本人的理解勇哥简单的程序来诠释FutureTask的意思,程序的设计思想为:当一辆公交车到站之后司机需要停车等待所有乘客上车之后才能继续开车行驶,这里我们把司机开车认为为主线程,乘客上车为其他线程,只有所有乘客上车完毕司机才能开车。我们可以把乘客上车当做是一个异步计算任务,异步任务一执行完毕,主线程启动并且这个异步任务状态不再改变。
程序如下:
乘客这个异步任务:
package com.test.futuretask;
import java.util.concurrent.Callable;
public class PassengerCallable implements Callable{
//总共有10个等待上公交的乘客
private int passengerCounts = 10;
//所有乘客上公交花费的所有时间
private int totalTime = 0;
@Override
public Integer call() throws Exception {
while(passengerCounts > 0) {
passengerCounts--;
totalTime++;
//每个乘客上车花费1秒
Thread.sleep(1 * 1000);
}
return totalTime;
}
}
司机主线程:
package com.test.futuretask;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
public class BusDriverMainThread {
public static void main(String args[]) {
Callable callable = new PassengerCallable();
FutureTask futureTask = new FutureTask(callable);
Thread thread = new Thread(futureTask);
thread.start();
while (!futureTask.isDone()) {
System.out.println("还有乘客没有上车,司机继续等待....");
}
int countTime = 0;
try {
countTime = futureTask.get();
} catch (InterruptedException e) {
// TODO
e.printStackTrace();
} catch (ExecutionException e) {
// TODO
e.printStackTrace();
} finally {
System.out.println("所有乘客都已全部上车,司机请开车,总共花费" + countTime + "秒");
}
}
}