MST

星途 面试题库

面试题:Java异步编程中的Future与Callable

在Java异步编程中,简述Future和Callable接口的作用及它们如何配合使用来实现异步任务的执行与结果获取。请给出一个简单的代码示例说明。
14.6万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

Future接口作用

Future接口用于表示异步计算的结果。它提供了方法来检查任务是否完成,等待任务完成,并获取任务执行的结果。通过Future,可以在主线程中异步执行一个任务,然后在需要的时候获取该任务的执行结果,而无需阻塞主线程一直等待任务完成。

Callable接口作用

Callable接口类似于Runnable接口,但是Callable可以在任务执行结束后返回一个结果,并且可以抛出异常。Runnable接口的run方法没有返回值且不能抛出受检异常,而Callable接口的call方法可以返回泛型类型的结果并抛出异常。

配合使用方式

通常,Callable接口的实现类会被提交到ExecutorService(线程池)中执行。ExecutorServicesubmit方法接受一个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();
        }
    }
}

在上述代码中:

  1. 创建了一个单线程的线程池ExecutorService
  2. 定义了一个Callable任务,在call方法中模拟了一个耗时2秒的操作,并返回结果42。
  3. 使用executorService.submit(callableTask)提交任务并返回Future对象。
  4. 通过future.get()获取任务执行的结果,此操作会阻塞主线程,直到任务完成并返回结果。最后关闭线程池。