Java FutureTask浅析

FutureTask浅析

FutureTask是与Java多线程编程关联密切的一个概念。面试中也有关于FutureTask的问题——Java创建线程的几种方式:

  1. 编写类继承Thread
  2. 编写类继承Runnable,然后将该类的作为参数传递给Thread的构造函数。
  3. 使用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);
posted @ 2021-03-10 20:43  霍丙南  阅读(345)  评论(0编辑  收藏  举报