在 Java 中,Callable
和 Future
是用于支持并发编程的关键接口,主要用于执行异步任务并获取任务的执行结果。
Callable
接口:
Callable
接口类似于Runnable
接口,不同之处在于Callable
接口的call()
方法可以返回执行结果,并且可以抛出异常。Callable
接口定义如下:
public interface Callable<V> {
V call() throws Exception;
}
Callable
接口通常使用 ExecutorService
来提交执行异步任务,返回一个 Future
对象,后者用于获取任务的执行结果。
在这个代码片段中,Callable<Integer> task = () -> { Thread.sleep(2000); return 42; };
使用了 Java 8 引入的 Lambda 表达式来创建一个 Callable
接口的实例。
具体解释如下:
Callable<Integer>
:指定了task
是一个返回整数类型结果的Callable
接口实例。->
:Lambda 操作符,用来分隔参数列表和 Lambda 表达式的主体部分。{}
:Lambda 表达式的主体,即方法体。Thread.sleep(2000)
:在任务执行的过程中暂停当前线程 2000 毫秒(即 2 秒)。return 42
:返回结果为整数 42。
因此,这个 Lambda 表达式实现了 Callable
接口的 call()
方法的具体逻辑:让当前线程休眠2秒,然后返回整数值 42。在实际执行时,这个任务会被提交给线程池执行,并且通过 Future
接口获取任务执行结果的返回值为 42。
Lambda 表达式简化了匿名内部类的书写方式,并且使代码更加简洁和易读。在这个例子中,Lambda 表达式代替了原先需要通过匿名内部类实现的 Callable
接口中的call()
方法。
在前面提到的代码片段中,实际上并没有直接调用 call()
方法。在这里,并没有显式地调用 task.call()
方法。相反,通过将 task
对象提交给一个线程池的 submit
方法,线程