Java并发编程中的FutureTask详解
- 1、核心特点
- 2、基本用法
- 2.1 包装 Callable 任务
- 2.2 包装 Runnable 任务
- 3、注意事项
💖The Begin💖点点关注,收藏不迷路💖
|
FutureTask
是 Java 并发包 java.util.concurrent
中的一个类,它实现了 Future
接口,并提供了异步执行计算任务的能力。
1、核心特点
- 异步执行:允许你提交任务进行异步执行,主线程可以继续执行其他任务。
- 结果获取:通过
get()
方法获取任务执行的结果,如果任务未完成,则当前线程会阻塞。 - 可取消:可以尝试取消任务的执行,如果任务已启动且允许中断,则任务执行线程会被中断。
- 任务检查:通过
isDone()
方法检查任务是否已完成。
2、基本用法
2.1 包装 Callable 任务
当你有一个返回结果的计算任务时,可以使用 Callable
接口。FutureTask
可以包装 Callable
任务,并提供异步执行的能力。
Callable<Integer> task = () -> {
// 模拟耗时计算
return 123;
};
FutureTask<Integer> futureTask = new FutureTask<>(task);
ExecutorService executor = Executors.newSingleThreadExecutor();
executor.submit(futureTask);
// 等待任务完成并获取结果
try {
Integer result = futureTask.get();
System.out.println("结果: " + result);
} catch (Exception e) {
e.printStackTrace();
}
executor.shutdown();
2.2 包装 Runnable 任务
对于不返回结果的 Runnable 任务,FutureTask 的 get() 方法将返回 null。
Runnable task = () -> {
// 模拟耗时操作
};
FutureTask<?> futureTask = new FutureTask<>(task, null);
ExecutorService executor = Executors.newSingleThreadExecutor();
executor.submit(futureTask);
try {
// 等待任务完成,但不获取结果
futureTask.get();
} catch (Exception e) {
e.printStackTrace();
}
executor.shutdown();
3、注意事项
1、使用 get() 方法时,注意处理 ExecutionException。
2、调用 cancel(true) 时,任务可能因不响应中断而无法被取消。
3、使用完 ExecutorService 后,记得关闭它以释放资源。
💖The End💖点点关注,收藏不迷路💖
|