在 Java 中可以用来创建线程的方式很多,比如由 Java 提供的 Thread、Runnable 等。本文章来介绍使用 FutureTask 创建线程,以及其流程。
Thread 和 Runnable 的问题
众所周知,使用 Thread、Runnable 创建线程是非常方便的,只要实现 线程的 run 方法即可。但是通过 Thread、Runnable 实现 run 方法创建的线程是无法获取返回结果的,原因是线程方法 run 本身是没有返回值的。但是在很多场景中,我们是需要 异步执行的同时获取其线程执行的返回结果的。因此 Java 除了 Thread、Runnable 外,还提供了 FutureTask,它使得我们可以在异步执行的同时获取到线程的返回结果。
本文就来介绍一下 FutureTask 类的简单使用。
FutureTask 介绍
FutureTask 类本身不能用来创建线程,创建线程的工作仍然是由 Thread 类来创建的,FutureTask 和 Runnable 类似,是通过 Thread 类的构造方法传递给 Thread 类的。但是注意观察,Thread 类并没有一个构造方法是用于接受 FutureTask 类型的构造方法。
FutureTask 定义与继承关系
那么,FutureTask 为什么可以传递给 Thread 类呢?这里重点不是看 Thread 类的构造方法,而是应该看一下 FutureTask 类的定义,该类的定义如下:
public class FutureTask<V> implements RunnableFuture<V> {
可以看到,FutureTask 实现了 RunnableFuture 接口,那么继续看 RunnableFuture 接口的定义,该定义如下:
public interface RunnableFuture<V> extends Runnable, Future<V> {
void run();
}
从 RunnableFuture 接口的定义可以看出,它继承了 Runnable 接口,那么这样,就可以将 FutureTask 类以构造方法参数的形式传递给 Thread 类了。在 RunnableFuture 接口中有一个 run 方法,那么这就要求实现 RunnableFuture 接口的类要去实现了 run() 方法。这样,FutureTask 类既然实现了 RunnableFuture 接口,那么 FutureTask 类中必然有一个 run 方法是供 Thread 类调用的。
那么 RunnableFuture 继承的 Future 是什么呢?看一下它的定义,定义如下:</