面试题答案
一键面试使用Future实现异步任务
- 创建异步任务:实现
Callable
接口,Callable
接口的call
方法中定义异步执行的任务,该方法有返回值。例如:
import java.util.concurrent.Callable;
public class MyCallable implements Callable<Integer> {
@Override
public Integer call() throws Exception {
// 模拟异步任务
Thread.sleep(2000);
return 42;
}
}
- 提交任务并获取Future对象:通过
ExecutorService
的submit
方法提交Callable
任务,该方法返回一个Future
对象。ExecutorService
是一个管理线程池的接口。例如:
import java.util.concurrent.*;
public class FutureExample {
public static void main(String[] args) {
ExecutorService executorService = Executors.newSingleThreadExecutor();
Future<Integer> future = executorService.submit(new MyCallable());
executorService.shutdown();
try {
Integer result = future.get();
System.out.println("异步任务执行结果: " + result);
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
}
}
在上述代码中,executorService.submit(new MyCallable())
提交任务并返回Future
对象。future.get()
用于获取异步任务的执行结果,该方法会阻塞当前线程,直到异步任务完成并返回结果。
Future工作原理
- 任务提交:当调用
ExecutorService
的submit
方法提交Callable
任务时,ExecutorService
会将任务安排到线程池中执行。 - Future对象返回:
submit
方法立即返回一个Future
对象,该对象代表异步任务的执行结果。此时任务可能还未开始执行,或者正在执行中。 - 获取结果:调用
Future
对象的get
方法时,如果任务已经完成,get
方法会立即返回任务的执行结果;如果任务尚未完成,get
方法会阻塞当前线程,直到任务完成并返回结果。Future
还提供了isDone
方法用于判断任务是否完成,cancel
方法用于取消任务。
Future在实际应用场景中的作用
- 提高系统响应速度:在Web应用中,某些耗时的操作(如数据库查询、远程服务调用等)可以异步执行。例如,一个电商网站在展示商品详情页面时,需要从多个数据源获取数据,如商品基本信息、用户评价、相关推荐等。可以将这些获取数据的操作异步执行,通过
Future
获取结果,这样可以在获取所有数据的同时,页面能够快速返回给用户,提高用户体验。 - 并行计算:在科学计算或数据分析场景中,有时需要对大量数据进行并行处理。可以将不同的数据块处理任务提交为异步任务,通过
Future
获取每个任务的计算结果,最后汇总结果。例如,计算一个大数组中各个子数组的和,可以将每个子数组的求和任务作为异步任务提交,利用Future
并行获取结果并最终汇总。