当前位置: 首页 > 面试题库 >

是否应该将Callable优先于Runnable?

劳韬
2023-03-14
问题内容

我已经了解了Java RunnableCallable接口之间的区别。从Java
1.5开始,已将其他功能添加到Runnable接口,并已调用这些功能Callable以保持向后兼容性。

我的问题是,现在我们有了Callable接口,我们应该一直使用吗?不使用Callable和使用的用例是Runnable什么?


问题答案:

两者都有其用途,并且都由java.util.concurrent中的Executor框架支持。Runnable已经存在了更长的时间,但是它仍然在使用并且不被阻止。

可调用程序可以抛出异常并返回值,这使它们成为更好的抽象方法,用于承载结果的任务(例如,从网络中获取资源,执行昂贵的值计算等)[摘自Goetz的 Java
Concurrency in Practice
,布洛赫(Bloch)等。等,关于Java并发的标准工作]。

因此,如果您正在设计API,建议您尽可能使用Callables。如果您确定任务不会返回值并且不会引发异常,那么Runnable也是一个有效的选择。这里没有黑色和白色,尤其是因为Runnable可以轻松地包装在Callables中,反之亦然。

另外,请注意您的Callable实现无需声明throws Exception;Callable本身声明它的事实仅是允许实现者抛出任何检查的异常。但是,仅依赖Callable接口的Callable调用者将不得不编写异常处理代码。
还要注意,Callables不需要返回值;您只需声明您的Callable即可返回Void(大写的’ V‘)。



 类似资料:
  • 问题内容: 在Java中,重载该方法会产生不良的说唱效果,尽管我不明白为什么。诸如此类的类在Java 8和Java 10中都使用它来确保被调用。但是,引入了Java 9 ,它使用PhantomReference机制而不是GC终结。起初,我认为这只是将终结处理添加到第三方类中的一种方法。但是,其javadoc中给出的示例显示了一个用例,可以很容易地用终结器重写。 是否应该按照Cleaner 重写所有

  • 我有一个关于Spring Security和Spring缓存的问题。假设我有一个方法,我已经用@PreAuthorize(“条件”)和@Cacheable(...)注释了这个方法,就像这样 @PreAuthorize(http://docs.spring.io/spring-security/site/docs/3.0.x/reference/ns-config.html)是否优先于@Cachea

  • 问题内容: 简而言之,我正在实现一个图形,现在正在研究Kruskal,我需要一个优先级队列。我对优先级队列的定义是,具有最小密钥的元素将排在最前面?错了吗 因为当我在队列中插入加权边(或数字)时,它们不会最终排序。 那会打印出来;[1、54、51、102、99、55]。这不是我希望他们成为的那样!是的,我制作了一个进入优先级队列的编译器,该队列从边缘对象中提取数字并根据该int进行比较。因此,这应

  • 可变模板有很多优点,但在某些情况下,C型可变函数(使用

  • 我有一个用以下选项声明的RabbitMQ队列: 我试图从Node-RED连接到队列,使用插件,在连接源下设置了以下拓扑: 我得到以下错误: “AMQP输入节点断开连接错误:操作失败:QueueDeclare;406(Premission-failed),消息为“Premission_failed-vhost中队列'myqueue'的参数'x-max-priority'不相等”:未收到任何,但cur

  • 是否有可用于 Haskell 的斐波那契堆/优先级队列?(甚至是渐近更好的?我在这个问题中找到了各种优先级队列实现的列表,但我找不到它们中的任何一个是否满足斐波那契堆的摊销运行时间: < li>Find-minimum是O(1)摊销时间。 < li >操作insert、decrease key和merge (union) work是O(1)摊销时间。 < li >操作删除和删除最小值是O(log