Java FutureTask浅析
FutureTask浅析
FutureTask是与Java多线程编程关联密切的一个概念。面试中也有关于FutureTask的问题——Java创建线程的几种方式:
- 编写类继承
Thread。 - 编写类继承
Runnable,然后将该类的作为参数传递给Thread的构造函数。 - 使用
FutureTask。
那么创建线程时为什么要使用FutureTask呢?其实它解决的是线程处理结果如何返回的问题。通常我们使用的Runnable接口中,其成员函数
void run()中代码是线程具体执行的代码,这个成员函数没有返回值,这也就造成了我们多线程处理的结果无法返回,只能够使用类似出参
的方式去获取线程护理的结果。
Java中有相应的接口,来处理这样的场景,它就是Callable<V>接口。但是Callable<V>无法作为参数传递给线程,它们两个之间没有任何联系。
而FutureTask<V>类解决了这一问题,我们可以通过一个类图来展示。

FutureTask<V>就像是一个桥梁,连接了Callable<V>和Thread。
与此同时,FutureTask<V>更像是一种标准,即便你使用自定义的Runable类来处理这样的情况,最终无论是代码实现还是效果展示,都和FutureTask<V>很相像。
使用FutureTask计算斐波那契数列。
FutureTask<Integer> calcFibonacci = new FutureTask<Integer>(new Callable<Integer>()
{
@Override
public Integer call() throws Exception
{
return fibonacci(20);
}
});
new Thread(calcFibonacci).start();
System.out.println("开始计算斐波那契数列第20项");
Integer result = calcFibonacci.get(); // get方法会阻塞,直到线程结束。
System.out.println("斐波那契数列第20项为: " + result);

浙公网安备 33010602011771号