当前位置: 技术文章>> 100道Java面试题之-Java中的Future和Callable接口有什么作用?它们之间有何区别?

文章标题:100道Java面试题之-Java中的Future和Callable接口有什么作用?它们之间有何区别?
  • 文章分类: 后端
  • 5510 阅读
### Java中的Future和Callable接口的作用及区别 #### Future接口的作用 Future接口是Java 1.5引入的,它用于表示异步计算的结果。Future提供了检查计算是否完成的方法,能够等待计算的完成,并检索计算的结果。具体来说,Future接口的作用包括: 1. **获取异步运算的结果**:通过Future的`get()`方法,可以获取异步计算的结果。如果计算尚未完成,调用`get()`方法的线程会被阻塞,直到计算完成。 2. **控制异步任务的执行**:Future提供了`cancel(boolean mayInterruptIfRunning)`方法,用于取消异步任务的执行。如果任务已经开始执行,且`mayInterruptIfRunning`参数为`true`,则会尝试中断任务。 3. **查询任务状态**:通过`isCancelled()`和`isDone()`方法,可以查询异步任务是否已取消或已完成。 #### Callable接口的作用 Callable接口类似于Runnable接口,都用于指定线程要执行的操作。但Callable接口的主要优势在于它能够返回结果,并且能抛出异常。Callable接口的`call()`方法有一个泛型返回值,这意味着可以返回任何类型的值,而不仅仅是void。 Callable接口通常与`ExecutorService`一起使用,通过`submit()`方法将Callable任务提交给线程池执行。执行完毕后,`submit()`方法会返回一个Future对象,用于表示异步计算的结果。 #### Future和Callable之间的区别 | | Future | Callable | | --- | --- | --- | | **类型** | 接口 | 接口 | | **作用** | 表示异步计算的结果,提供检查计算是否完成的方法,获取计算结果等。 | 定义了一个带有返回值的任务,可以被线程池执行,并返回执行结果。 | | **返回值** | 不直接返回值,而是提供获取结果的方法(如`get()`)。 | 通过`call()`方法返回一个泛型值。 | | **使用场景** | 通常在异步编程中与Callable接口配合使用,用于获取Callable任务的结果。 | 与ExecutorService结合使用,将任务提交给线程池执行,并获取执行结果。 | | **异常处理** | Future本身不直接处理异常,但可以通过Future的`get()`方法抛出任务执行时产生的异常。 | Callable的`call()`方法可以抛出异常,这些异常会被封装在Future的`get()`方法抛出的异常中。 | 综上所述,Future和Callable接口在Java并发编程中扮演着重要角色。Future用于表示异步计算的结果,并提供了一系列控制异步任务执行和查询任务状态的方法。而Callable接口则定义了一个可以返回结果的任务,它与ExecutorService结合使用,可以实现更加灵活和强大的异步编程功能。
推荐文章