FutureTask
是 Java 中用于并发编程的一个类。它实现了 RunnableFuture
接口,RunnableFuture
本身是 Runnable
和 Future
接口的一个组合。因此,总的来说,FutureTask
类有以下结构关系:
-
继承层次:
java.lang.Object
java.util.concurrent.FutureTask<V>
-
实现的接口:
Runnable
Future<V>
RunnableFuture<V>
基于上述结构,FutureTask
类提供以下主要功能和方法:
类层次结构
public class FutureTask<V>
extends Object
implements RunnableFuture<V>
主要方法:
构造函数:
FutureTask(Callable<V> callable)
: 用一个Callable
对象创建一个FutureTask
。FutureTask(Runnable runnable, V result)
: 用一个Runnable
对象和一个结果对象来创建一个FutureTask
。
Runnable 接口的方法:
void run()
: 该方法用于启动任务的执行。
Future 接口的方法:
boolean cancel(boolean mayInterruptIfRunning)
: 尝试取消任务的执行。boolean isCancelled()
: 判断任务是否已经被取消。boolean isDone()
: 判断任务是否已经完成。V get()
: 获取任务的执行结果(会阻塞,直到任务完成)。V get(long timeout, TimeUnit unit)
: 带超时机制地获取任务的执行结果。
例子
以下是一个简单的 FutureTask
例子:
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
public class FutureTaskExample {
public static void main(String[] args) {
// 创建一个 Callable 对象
Callable<Integer> callable = () -> {
Thread.sleep(1000); // 模拟长时间的任务运行
return 123;
};
// 用 Callable 创建一个 FutureTask
FutureTask<Integer> futureTask = new FutureTask<>(callable);
// 用 FutureTask 创建一个线程并启动
Thread thread = new Thread(futureTask);
thread.start();
// 主线程继续执行其他任务
System.out.println("Main thread is running...");
try {
// 获取 Callable 任务的执行结果
Integer result = futureTask.get();
System.out.println("Result from FutureTask: " + result);
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
}
}
在这个例子中,FutureTask
被用于包装一个 Callable
对象,然后被一个新线程执行。主线程可以继续执行其他任务,并在需要时通过 FutureTask.get()
得到异步任务的结果。