面试题答案
一键面试Future接口作用
Future
接口用于表示异步计算的结果。它提供了方法来检查任务是否完成,等待任务完成,并获取任务执行的结果。通过Future
,可以在主线程中异步执行一个任务,然后在需要的时候获取该任务的执行结果,而无需阻塞主线程一直等待任务完成。
Callable接口作用
Callable
接口类似于Runnable
接口,但是Callable
可以在任务执行结束后返回一个结果,并且可以抛出异常。Runnable
接口的run
方法没有返回值且不能抛出受检异常,而Callable
接口的call
方法可以返回泛型类型的结果并抛出异常。
配合使用方式
通常,Callable
接口的实现类会被提交到ExecutorService
(线程池)中执行。ExecutorService
的submit
方法接受一个Callable
对象,并返回一个Future
对象。通过这个Future
对象可以获取Callable
任务执行的结果。
代码示例
import java.util.concurrent.*;
public class FutureAndCallableExample {
public static void main(String[] args) {
// 创建线程池
ExecutorService executorService = Executors.newSingleThreadExecutor();
// 创建Callable任务
Callable<Integer> callableTask = () -> {
// 模拟耗时操作
Thread.sleep(2000);
return 42;
};
// 提交任务并获取Future对象
Future<Integer> future = executorService.submit(callableTask);
try {
// 获取任务执行结果,这里会阻塞直到任务完成
Integer result = future.get();
System.out.println("任务执行结果: " + result);
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
} finally {
// 关闭线程池
executorService.shutdown();
}
}
}
在上述代码中:
- 创建了一个单线程的线程池
ExecutorService
。 - 定义了一个
Callable
任务,在call
方法中模拟了一个耗时2秒的操作,并返回结果42。 - 使用
executorService.submit(callableTask)
提交任务并返回Future
对象。 - 通过
future.get()
获取任务执行的结果,此操作会阻塞主线程,直到任务完成并返回结果。最后关闭线程池。