FutureTask 例子与详解
一. FutureTask 的使用
如果使用 Executors 创建线程池并且使用 submit()
方法提交任务,这个方法会获取一个 Future 类型的返回值,根据 Future 可以获取到方法最后的返回值,而 execute()
方法则没有返回值。通过源码其实可以看到 submit()
方法是创建了一个 FutureTask 对象。
FutureTask 是 Future 接口的一个实现类,其中包含了 cancel()
、get()
等方法。同时 FutureTask 还实现了 Runnable 接口,所以 FutureTask 可以直接放入线程中运行。
1. FutureTask + Thread
FutureTask 同时实现了 Runnable 接口,所以创建的 FutureTask 对象可以直接放入新建的线程中运行。最后可以通过 get()
来获取运行结果。
FutureTask<String> futureTask = new FutureTask<>(() -> {
return result;
});
Thread thread = new Thread(futureTask1);
Object result = futureTask.get();
2. FutureTask + 线程池
ExecutorService 中提供了一个 submit()
方法来帮助我们在使用线程池的时候新建一个 FutureTask。
ExecutorService threadPool = Executors.newFixedThreadPool(1);
Future<Object> future = threadPool.submit(() -> {
return null;
});
Object result = future.get();
- submit() 源码
public Future<?> submit(Runnable task) {
if (task == null) throw new NullPointerException();
RunnableFuture<Void> ftask = newTaskFor(task, null);
execute(ftask);
return ftask;
}
protected <T> RunnableFuture<T> newTaskFor(Runnable runnable, T value) {
return new FutureTask<T>(runnable, value);
}
3. 简单参考例子
FutureTask<String> futureTask1 = new FutureTask<>(() -> {
System.out.println("磨豆子");
System.out.println("拿杯子");
System.out.