高级java每日一道面试题-2025年01月03日-并发篇-什么是Callable和Future?
如果有遗漏,评论区告诉我进行补充
面试官: 什么是Callable和Future?
我回答:
Callable
-
定义与功能:
- Callable是Java 5引入的一个接口,用于定义可并发执行的任务。它类似于Runnable接口,但提供了更多的功能。
- Callable可以在执行完成后返回结果,而Runnable无法返回任何结果。
- Callable可以抛出受检异常(Checked Exception),从而更好地处理任务执行过程中的错误。
-
接口定义:
- Callable接口位于java.util.concurrent包中。
- 其定义非常简洁,主要包含一个call()方法,该方法包含任务的逻辑,执行后返回一个结果,或者抛出异常。
-
使用场景:
- Callable更适合那些需要返回结果或需要处理执行过程中错误的任务。
Future
-
定义与功能:
- Future是Java并发包中的一个接口,用于表示一个异步计算的结果。
- 它提供了一种机制,用于检查计算是否完成、获取计算结果、取消计算任务等操作。
-
接口定义:
- Future接口也位于java.util.concurrent包中。
- 常用的方法包括:
- get():用于获取任务执行的结果。如果任务尚未完成,则get()方法会阻塞直到任务完成。
- cancel(boolean mayInterruptIfRunning):取消任务的执行。
- isDone():判断任务是否已经完成。
- isCancelled():判断任务是否已经被取消。
-
使用场景:
- Future通常与Callable结合使用,以便我们可以提交一个Callable任务并获取它的计算结果。
Callable和Future的关系与应用
-
关系:
- 通过实现Callable接口,可以创建一个可调用的任务,并将其提交给ExecutorService执行器。
- 当提交一个Callable任务时,ExecutorService会返回一个Future对象,用于表示任务的计算结果。
-
应用:
- 异步任务提交与结果获取:我们可以在一个线程中启动另一个线程执行任务,并在需要的时候通过Future对象获取任务的结果。
- 异步任务管理:通过Future对象,可以管理和监控异步任务的状态,例如判断任务是否完成、取消任务等。
-
示例代码:
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
public class CallableFutureExample {
public static void main(String[] args) {
// 创建线程池
ExecutorService executor = Executors.newFixedThreadPool(2);
// 定义一个Callable任务
Callable<Integer> task = () -> {
System.out.println("Calculating sum...");
Thread.sleep(2000);
return 10 + 20;
};
// 提交任务并获取Future对象
Future<Integer> future = executor.submit(task);
try {
// 获取计算结果
Integer result = future.get();
System.out.println("Result: " + result);
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
} finally {
// 关闭线程池
executor.shutdown();
}
}
}
在这个示例中,我们创建了一个线程池并提交了一个Callable任务,Future用于跟踪任务的执行状态和获取结果。当我们调用future.get()时,主线程会阻塞,直到任务完成并返回结果。
总结
Callable
允许任务返回结果,并且可以声明抛出异常。Future
提供了对任务状态的检查和结果获取的功能。- 两者结合起来可以实现异步任务的提交、管理和结果的收集。
对于更复杂的场景,比如需要组合多个Future
或者想要更好地控制并发行为,还可以考虑使用CompletableFuture
,它是 Java 8 引入的一个更强大的工具,它不仅继承了Future
的功能,还添加了许多实用的方法来简化异步编程。