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);