Java面试题之多线程 什么是FutureTask?
FutureTask
是 Java 中一个非常重要的类,它实现了 Runnable
接口并且同时实现了 Future
接口。FutureTask
主要用于表示一个异步计算的结果,可以在多线程环境中使用,允许你在将来某个时刻获取计算的结果。
异步计算:FutureTask
可以在一个线程中执行计算,并在另一个线程中获取结果。这使得它非常适合于需要并行处理的场景。
可取消:FutureTask
提供了取消任务的功能。你可以通过调用 cancel()
方法来取消任务的执行。
状态管理:FutureTask
维护了任务的状态,包括是否完成、是否被取消等。你可以通过 isDone()
和 isCancelled()
方法来查询任务的状态。
结果获取:通过 get()
方法,你可以获取任务的计算结果。如果任务尚未完成,调用 get()
会阻塞当前线程,直到结果可用。
下面是一个简单的示例,展示了如何使用 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(2000);
return 42;
};
// 创建 FutureTask
FutureTask<Integer> futureTask = new FutureTask<>(callable);
// 启动线程
new Thread(futureTask).start();
try {
// 在这里可以做其他事情
System.out.println("Doing other work...");
// 获取结果,get() 会阻塞直到计算完成
Integer result = futureTask.get();
System.out.println("Result: " + result);
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
}
}
FutureTask
是一个强大的工具,适用于需要异步计算和结果获取的场景。它结合了 Runnable
和 Future
的特性,使得多线程编程更加灵活和高效。