文章目录

  • 运行机制
  • 返回值的不同
  • Exception处理

java中Runnable和Callable的区别

在java的多线程开发中Runnable一直以来都是多线程的核心,而Callable是java1.5添加进来的一个增强版本。

本文我们会详细探讨Runnable和Callable的区别。

运行机制

首先看下Runnable和Callable的接口定义:

@FunctionalInterface
public interface Runnable {/*** When an object implementing interface <code>Runnable</code> is used* to create a thread, starting the thread causes the object's* <code>run</code> method to be called in that separately executing* thread.* <p>* The general contract of the method <code>run</code> is that it may* take any action whatsoever.** @see     java.lang.Thread#run()*/public abstract void run();
}
@FunctionalInterface
public interface Callable<V> {/*** Computes a result, or throws an exception if unable to do so.** @return computed result* @throws Exception if unable to compute a result*/V call() throws Exception;
}

Runnable需要实现run()方法,Callable需要实现call()方法。

我们都知道要自定义一个Thread有两种方法,一是继承Thread,而是实现Runnable接口,这是因为Thread本身就是一个Runnable的实现:

class Thread implements Runnable {/* Make sure registerNatives is the first thing <clinit> does. */private static native void registerNatives();static {registerNatives();}...

所以Runnable可以通过Runnable和之前我们介绍的ExecutorService 来执行,而Callable则只能通过ExecutorService 来执行。

返回值的不同

根据上面两个接口的定义,Runnable是不返还值的,而Callable可以返回值。

如果我们都通过ExecutorService来提交,看看有什么不同:

  • 使用runnable
    public void executeTask() {ExecutorService executorService = Executors.newSingleThreadExecutor();Future future = executorService.submit(()->log.info("in runnable!!!!"));executorService.shutdown();}
  • 使用callable
    public void executeTask() {ExecutorService executorService = Executors.newSingleThreadExecutor();Future future = executorService.submit(()->{log.info("in callable!!!!");return "callable";});executorService.shutdown();}

虽然我们都返回了Future,但是runnable的情况下Future将不包含任何值。

Exception处理

Runnable的run()方法定义没有抛出任何异常,所以任何的Checked Exception都需要在run()实现方法中自行处理。

Callable的Call()方法抛出了throws Exception,所以可以在call()方法的外部,捕捉到Checked Exception。我们看下Callable中异常的处理。

 public void executeTaskWithException(){ExecutorService executorService = Executors.newSingleThreadExecutor();Future future = executorService.submit(()->{log.info("in callable!!!!");throw new CustomerException("a customer Exception");});try {Object object= future.get();} catch (InterruptedException e) {e.printStackTrace();} catch (ExecutionException e) {e.printStackTrace();e.getCause();}executorService.shutdown();}

上面的例子中,我们在Callable中抛出了一个自定义的CustomerException。

这个异常会被包含在返回的Future中。当我们调用future.get()方法时,就会抛出ExecutionException,通过e.getCause(),就可以获取到包含在里面的具体异常信息。

本文的例子可以参考https://github.com/ddean2009/learn-java-concurrency/tree/master/runnable-callable

更多精彩内容且看:

  • 区块链从入门到放弃系列教程-涵盖密码学,超级账本,以太坊,Libra,比特币等持续更新
  • Spring Boot 2.X系列教程:七天从无到有掌握Spring Boot-持续更新
  • Spring 5.X系列教程:满足你对Spring5的一切想象-持续更新
  • java程序员从小工到专家成神之路(2020版)-持续更新中,附详细文章教程

更多教程请参考 flydean的博客

java中Runnable和Callable的区别相关推荐

  1. Java中Runnable和Thread的区别

    2019独角兽企业重金招聘Python工程师标准>>> 在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口:Thread类是在java.la ...

  2. Java 的Runnable和Callable的区别

    Runnable和Callable的区别是, (1)Callable规定的方法是call(),Runnable规定的方法是run(). (2)Callable的任务执行后可返回值,而Runnable的 ...

  3. 再谈 Java中Runnable和Thread的区别

    在面试中老有面试官问这个问题,个人觉得这个问题问的没有技术,一个死记硬背就能回答的很好.但是更深的回答是什么了,那就是直接回答源码吧. thread类实现了runnable 接口 ,Runnable就 ...

  4. Runnable和Callable的区别:

    Runnable和Callable的区别: (1)Runnable是自从java1.1就有了,而Callable是1.5之后才加上去的(2)Callable规定的方法是call(),Runnable规 ...

  5. Java中notify和notifyAll的区别 - 何时以及如何使用

    Java  notify   vs notifyAll notify和notifyAll方法之间有什么区别是棘手的Java问题之一! Condition 是个什么玩意? 提几个问题,从问题中去了解去学 ...

  6. java中的异常种类和区别以及处理机制和区别

    java中的异常种类和区别以及处理机制和区别 按照异常需要处理的时机分为编译时异常(也叫强制性异常)也叫 CheckedException 和运行时异常(也叫非强制性异常)也叫 RuntimeExce ...

  7. java中ArrayList和LinkedList的区别

    首先来看ArrayList和LinkedList的集成类和接口的区别.// lang java public class ArrayList<E> extends AbstractList ...

  8. java中wait和sleep的区别

    文章目录 Wait和sleep的区别 唤醒wait和sleep java中wait和sleep的区别 在本篇文章中,我们将会讨论一下java中wait()和sleep()方法的区别.并讨论一下怎么使用 ...

  9. java throw与throws_基于Java中throw和throws的区别(详解)

    系统自动抛出的异常 所有系统定义的编译和运行异常都可以由系统自动抛出,称为标准异常,并且 Java 强烈地要求应用程序进行完整的异常处理,给用户友好的提示,或者修正后使程序继续执行. 语句抛出的异常 ...

最新文章

  1. android休眠唤醒驱动流程分析【转】
  2. reorder-list——链表、快慢指针、逆转链表、链表合并
  3. “买傅园慧送胡歌”,信息安全何以如此廉价
  4. 联想激发青年公益创业彰显“责任”意识
  5. [转]Chrome 控制台console的用法
  6. crontab 每天凌晨8点_凌晨3点47分,嘉兴8岁女孩竟独自站在街头,原因竟是…
  7. ARM CORTEX M0 程序镜像和启动逻辑
  8. 招聘数据爬取、数据处理与可视化(v2--解析JS渲染页面)
  9. jms pub/sub模型_JMS消息传递模型:点对点和发布/订阅
  10. simulink与gt联合仿真问题求解
  11. 【产品宣传广告片制作软件】Focusky教程 | 封面设计
  12. 微信小程序的总结(我学到了什么?我有了哪些成就?)
  13. 专属微信二维码python制作_如何通过一行代码制作个人专属动态微信二维码?
  14. 信息服务器在哪里打开,internet信息服务(lls)管理器在哪里打开
  15. Fite-C02-1班成员学习进度记录
  16. 最全计算机网络期末考试试题及答案
  17. 【Eclipse IDEA】IDEA 导入 eclipse Web项目
  18. kubernetes之容器探针(liveness and readiness probe)
  19. 从伯努利分布到交叉熵(一)
  20. 如何做好大数据监测和舆情案例分析工作的办法

热门文章

  1. linux命令中提取某一列,怎么用Linux命令提取表格文本中的某列
  2. 快速获取青年大学习完成截图
  3. 03-树3 Tree Traversals Again (c++递归实现)
  4. 模拟赛-20190228-随机数(random)
  5. Maskros的蓝桥刷题之路(1-13)
  6. python网络编程实例简析
  7. cocos2d-x初探学习笔记(12)--图形绘制
  8. 进程间通信 - 匿名管道实现
  9. 5招减少网站恶意文件上传
  10. C语言程序设计 | 大端小端存储解析以及判断方法