Callable
和Supplier
软件包中的java.util.concurrent
和java.util.function
功能接口分别具有以下签名-
public interface Callable<V> {
V call() throws Exception;
}
public interface Supplier<T> {
T get();
}
在某些特定的用例中,每个用例都比另一个适合吗?
答案 0 :(得分:5)
它们的用法差异可以从各自的文档中看到:
返回结果并且可能会引发异常的任务。实施者 定义一个没有参数的单一方法,称为call。
Callable接口类似于Runnable,两者都是 为可能由其执行实例的类设计 另一个线程。
代表结果的提供者。
不要求每个都返回一个新的或不同的结果 供应商被调用的时间。
这意味着Callable.call
的调用者希望引发异常,并将相应地处理该异常。这对于诸如读取和写入文件之类的任务很有用,其中可能会抛出多种IOException
。 Callable
也被设计为在另一个线程上运行。
Supplier
很笼统。只是“提供一个值”而已。
因此,Callable
比Supplier
更专业。如果您不处理其他线程,或者您的任务不太可能引发异常,建议使用Supplier
。
答案 1 :(得分:0)
除了明显的,可调用的抛出异常外,区别还在于语义。它们具有不同的名称,因为它们代表不同的事物。目的是使代码更易于理解。当使用Callable时,接口的选择意味着该对象将由另一个线程执行。当您使用供应商时,您暗示它只是一个向其他组件提供数据的对象。
答案 2 :(得分:0)
对于 Runnable
和 Callable
,它们自 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
只是表示一个没有任何输入参数但有返回值的函数,这是高度抽象的。