Java中的Callable vs Supplier接口

时间:2018-09-07 05:38:24

标签: java functional-interface

CallableSupplier软件包中的java.util.concurrentjava.util.function功能接口分别具有以下签名-

public interface Callable<V> {
    V call() throws Exception;
}

public interface Supplier<T> {
    T get();
}

在某些特定的用例中,每个用例都比另一个适合吗?

3 个答案:

答案 0 :(得分:5)

它们的用法差异可以从各自的文档中看到:

Callable

  

返回结果并且可能会引发异常的任务。实施者   定义一个没有参数的单一方法,称为call。

     

Callable接口类似于Runnable,两者都是   为可能由其执行实例的类设计   另一个线程

Supplier

  

代表结果的提供者。

     

不要求每个都返回一个新的或不同的结果   供应商被调用的时间。

这意味着Callable.call的调用者希望引发异常,并将相应地处理该异常。这对于诸如读取和写入文件之类的任务很有用,其中可能会抛出多种IOExceptionCallable也被设计为在另一个线程上运行。

另一方面,

Supplier很笼统。只是“提供一个值”而已。

因此,CallableSupplier更专业。如果您不处理其他线程,或者您的任务不太可能引发异常,建议使用Supplier

答案 1 :(得分:0)

除了明显的,可调用的抛出异常外,区别还在于语义。它们具有不同的名称,因为它们代表不同的事物。目的是使代码更易于理解。当使用Callable时,接口的选择意味着该对象将由另一个线程执行。当您使用供应商时,您暗示它只是一个向其他组件提供数据的对象。

答案 2 :(得分:0)

对于 RunnableCallable,它们自 Java 6 以来一直是并发包的一部分。这意味着它们都已准备好提交给 Executor 并异步运行.此处 Callable 有特定用法。

对于 Runnable(0 in 0 out)、Supplier(0 in 1 out)、Consumer(1 in 0 out) 和 Function(1 in 1 out),自 Java 8 以来,它们一直是函数特性的一部分。所有这些都准备好由 lambda 友好的东西处理,比如 CompletableFuture。这里的 Supplier 只是表示一个没有任何输入参数但有返回值的函数,这是高度抽象的。