什么是Callable和Future?说一下 runnable 和 callable 有什么区别?
2 个回答
二八佳人体似酥,腰间仗剑斩凡夫。唐家军### Callable和Future #### Callable接口 - **功能**:Callable接口类似于Runnable接口,但功能更强大。Callable接口用于创建可以返回结果的任务,并且可以抛出异常。 - **返回值**:Callable接口的`call()`方法允许返回一个结果,该结果可以通过Future对象获取。 - **异常处理**:Callable接口的`call()`方法允许抛出异常,这一点不同于Runnable接口的`run()`方法。 **示例代码**: ```java import java.util.concurrent.Callable; public class MyCallable implements Callable<Integer> { @Override public Integer call() throws Exception { // 模拟一些任务执行 Thread.sleep(2000); return 123; // 返回结果 } } ``` #### Future接口 - **功能**:Future接口表示一个异步任务的未来结果。它用于获取Callable任务的执行结果。 - **方法**: - `get()`:获取任务的执行结果。如果任务尚未完成,该方法会阻塞直到任务完成。 - `isDone()`:检查任务是否已经完成。 - `cancel(boolean mayInterruptIfRunning)`:尝试取消任务的执行。 - `isCancelled()`:检查任务是否已经被取消。 **示例代码**: ```java import java.util.concurrent.*; public class CallableAndFutureExample { public static void main(String[] args) { // 创建一个线程池 ExecutorService executor = Executors.newFixedThreadPool(2); // 创建一个Callable任务 Callable<Integer> callableTask = new MyCallable(); // 提交任务并获取Future对象 Future<Integer> future = executor.submit(callableTask); try { // 获取任务的结果(这将阻塞直到任务完成) Integer result = future.get(); System.out.println("Result: " + result); } catch (InterruptedException | ExecutionException e) { e.printStackTrace(); } finally { // 关闭线程池 executor.shutdown(); } } } ``` ### 总结 - **Callable**:用于定义可以返回结果和抛出异常的任务。它的`call()`方法返回任务的结果。 - **用途**:产生结果的异步任务。 - **示例**:`Callable<Integer> callableTask = new MyCallable();` - **Future**:用于表示异步任务的结果。它可以用于获取Callable任务的执行结果。 - **用途**:获取异步任务的结果。 - **示例**:`Future<Integer> future = executor.submit(callableTask);` 通过结合使用Callable和Future,可以创建并管理异步任务,获取任务的执行结果,并处理可能的异常。这样,能够更好地利用多线程的优势,提高程序的并发性能。发布于 2023-11-02 16:29 •IP属地 新疆举报评论收藏
有些东西不需要答案,态度就是答案。路飞Runnable接口中的run()方法的返回值是void,它做的事情只是纯粹地去执行run()方法中的代码而已; Callable接口中的call()方法是有返回值的,是一个泛型,和Future、FutureTask配合可以用来获取异步执行的结果。发布于 2021-07-01 19:44 •IP属地 广西举报评论收藏
公众号进入网站体验更佳

