目录
Future
1、基本介绍
Future是JDK1.5 提供的接口,是用来以阻塞的方式获取线程异步执行完的结果。
FutureTask 类是 Java 中 Future 接口的一个实现,同时也实现了 Runnable 接口。它用于表示异步计算的结果,允许一个任务在一个线程中计算结果,在另一个线程中获取计算的结果。
import java.util.concurrent.*;
public class CallableWithThreadPoolExample {
public static void main(String[] args) {
// 创建一个固定大小的线程池
ExecutorService executorService = Executors.newFixedThreadPool(2);
// 创建一个Callable任务
Callable<Integer> callableTask = () -> {
// 模拟耗时的计算
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 返回计算结果
return 42;
};
// 提交Callable任务给线程池执行
Future<Integer> future = executorService.submit(callableTask);
// 执行其他任务,不会阻塞
try {
// 获取Callable任务的结果,会阻塞直到结果准备好
Integer result = future.get();
System.out.println("Result: " + result);
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
} finally {
// 关闭线程池
executorService.shutdown();
}
}
}
2、按照提交任务的顺序获取执行结果
FutureTask 提供了 get 方法,可以用于获取异步计算的结果。然而,FutureTask 本身并没有保证按照任务提交的顺序返回结果。
如果你需要按照任务提交的顺序获取执行结果,你可以使用 ExecutorService 的 invokeAll 方法提交一批 Callable 任务,并得到一组 Future 对象,然后可以通过迭代这组 Future 对象来获取执行结果,迭代的顺序即为任务提交的顺序。
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.*;
public class OrderPreservingExample {
public static void main(String[] args) {
ExecutorService executorService = Executors.newFixedThreadPool(5);
List<Callable<String>> tasks = new ArrayList<>()