人物背景

老徐,男,本名徐福贵,从事Java相关研发工作多年,职场老油条,摸鱼小能手,虽然岁数不大但长的比较着急,人称老徐。据说之前炒某币败光了所有家产,甚至现在还有欠债。

阿珍,女,本名陈家珍,刚刚入职不久的实习生,虽然是职场菜鸟但聪明好学。据说是学校的四大校花之一,追求她的人从旺角排到了铜锣湾,不过至今还单身。

阿珍探出头看了看老徐的屏幕,全部都是绿色的曲线图,好奇地问:“老徐,你看的这是什么?”老徐看的太入神,转过头才发现阿珍,尬尴地笑了笑说:“我就是看看最近的行情。”老徐立马切换了窗口。

阿珍没在意又继续问到:“RunnableCallable两个接口我总搞混,这个到底有什么不同?”

面对阿珍的灵魂拷问,老徐淡定自若地说:“Runnable是用于提供多线程任务支持的核心接口,Callable是在Java 1.5中添加的Runnable的改进版本。”

“在聊它们不同之前,我们先分别了解一下两个接口。”老徐一边说着,一边打开了源码:

Runnable接口

@FunctionalInterface
public interface Runnable {public abstract void run();
}

Runnable接口是一个函数式接口,它只有一个run()方法,不接受任何参数,也不返回任何值。由于方法签名没有指定throws子句,因此无法进一步传播已检查的异常。它适用于我们不使用线程执行结果的情况,例如,异步打印日志:

package one.more;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;public class LoggingTask implements Runnable {private static Logger logger = LoggerFactory.getLogger(LoggingTask.class);private String name;public LoggingTask(String name) {this.name = name;}@Overridepublic void run() {logger.info("{}说:你好!", this.name);}
}

在上面例中,根据name参数把信息记录在日志文件中,没有返回值。我们可以通过Thread启动,比如:

public static void main(String[] args) {String name = "万猫学社";Thread thread = new Thread(new LoggingTask(name));thread.start();;
}

我们也可以通过ExecutorService启动,比如:

public static void main(String[] args) {String name = "万猫学社";ExecutorService executorService = Executors.newSingleThreadExecutor();executorService.execute(new LoggingTask(name));executorService.shutdown();
}

Callable接口

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

Callable接口也是一个函数式接口,它只有一个call()方法,不接受任何参数,返回一个泛型值V,在方法签名上包含throws Exception子句,因此我们可以很容易地进一步传播已检查异常。它适用于我们使用线程执行结果的情况,例如,异步计算阶乘:

package one.more;import java.util.concurrent.Callable;public class FactorialTask implements Callable<Integer> {private int n;public FactorialTask(int n) {this.n = n;}@Overridepublic Integer call() throws IllegalArgumentException {int fact = 1;if (n < 0) {throw new IllegalArgumentException("必须大于等于零");}for (int i = n; i > 1; i--) {fact = fact * i;}return fact;}
}

在上面例中,根据n参数计算它的阶乘,并可以返回计算结结果。我们只能通过ExecutorService启动,比如:

public static void main(String[] args) throws ExecutionException, InterruptedException {ExecutorService executorService = Executors.newSingleThreadExecutor();Future<Integer> future = executorService.submit(new FactorialTask(5));System.out.println(future.get());executorService.shutdown();
}

call()方法的结果可以通过Future对象获取到,如果在调用Future对象的get()方法时,call()方法出现了异常,异常会被继续传递,比如:

public static void main(String[] args) throws ExecutionException, InterruptedException {ExecutorService executorService = Executors.newSingleThreadExecutor();Future<Integer> future = executorService.submit(new FactorialTask(-1));System.out.println(future.get());executorService.shutdown();
}

抛出如下异常:

老徐回头看看了阿珍,说:“这回你知道有什么不同了吧!”阿珍一头雾水地说:“信息量有点大呀,可以给我总结一下吗?”“当然可以。”老徐回答。

总结

Runnable和Callable的不同:

  • Callable的任务执行后可返回值,Runnable的任务不能返回值。
  • Callable只可以通过ExecutorService启动,Runnable可以通过ThreadExecutorService启动。
  • Callable的call()方法可以传播已检查异常,Runnable的run()方法不可以。

最后,谢谢你这么帅,还给我点赞关注

老徐和阿珍的故事:Runnable和Callable有什么不同?相关推荐

  1. 二本非科班30岁转行架构师的老徐:站在巨人的肩膀学习才是捷径

    公司新来了个同事,级别比大白高一级,技术一流,来了之后把现有项目的性能优化了一遍,给公司省了不少成本. 后来才知道,他竟然是个「把烂牌打出王炸」的存在.他叫老徐,大白希望通过他的故事,帮你找到些可复制 ...

  2. 老徐教你学C语言(C语言进门教程)

          都说C语言是所有语言的根基--得C语言者得天下,为了更好的方便初学者入门,特编辑了以下C语言进门教程--老徐教你学C语言,希望对初学者有所帮助   00.老徐教你学C语言--C语言学习之道 ...

  3. 老徐杂谈:年后的第一个双休,你在做什么?

    年后归来的第一个双休 本来是计划约三五好友 吃吃饭,聊聊天 实在是因为太懒,哪都没去 家里待了两天 写了几篇文章 整理下以前的一些资料 浏览了下之前写的博客 泡了几壶茶 看了本书<白说> ...

  4. 老徐FrankXuLei受邀为花旗银行讲授《微软WCF服务分布式开发与SOA架构设计课程》...

    老徐FrankXuLei受邀为花旗银行上海研发中心讲授<微软WCF服务分布式开发与SOA架构设计课程> 受邀为花旗银行上海研发中心讲授<微软WCF服务分布式开发与SOA架构设计课程& ...

  5. @老徐FrankXuLei 受邀为上海师翊网络科技有限公司讲授《微软WCF分布式开发与SOA架构设计课程》

    原微博地址: http://weibo.com/1809430977/A4Iwn0Gth?type=repost 新浪微博:@老徐FrankXuLei 受邀为上海师翊网络科技有限公司讲授<微软W ...

  6. 老徐FrankXuLei 受邀为中国东方航空上海研发中心讲授微软.NET企业开发课程

    微软特邀讲师               老徐FrankXuLei                受邀为东方航空上海研发中心讲授微软.NET企业开发课程,介绍.NET新特性<WCF 4.5开发与 ...

  7. linux查看nas剩余大小,老徐玩NAS 篇二:我的群晖储存空间哪儿去了——100%破案的教程...

    老徐玩NAS 篇二:我的群晖储存空间哪儿去了--100%破案的教程 2019-05-26 23:28:21 74点赞 866收藏 36评论 前言 为了更好的体验Nas的功能,我前段时间终于安耐不住在J ...

  8. 微信官方小店小程序老徐解析

    微信近期发布了微信官方的小店小程序. 引起了市场上的一片哗然:微信要用小店小程序重新开淘宝?微信要正式开启自己的全民电商的霸业?以后的第三方平台还有存在的价值没有? 一时间市场上的猜测声四起. 老徐看 ...

  9. 讲一个老王与客户、供应商的故事

    老王有个杂货店,起初只是卖一卖食品.饮料.玩具,做的都是些大众品牌.老王原本以为自己的商品挺全的,但经营一段时间后发现,他的商品种类并不能满足有些客户的要求. 下面是老王的小本本上记录的几个客户问题. ...

  10. 老徐WEB:js入门学习 - javascript对象之String对象

    简单说明一下字符串. 字符串是由单引号或者双引号括起来的任意文本.如果文本里含有单引号,外面就用双引号括起来,如果文本里含有双引号,那么外面就用单引号括起来.如果文本里面的引号和外面的一致,那么文本里 ...

最新文章

  1. oracle中正则表达式规则,Oracle中的正则表达式(及函数)详解
  2. ZKWeb网站框架的动态编译的实现原理
  3. 文件系统:使用 yum 安装软件包
  4. 分布式系统面试 - 常见问题
  5. 假如你心中有个莎乐美
  6. 软件测试工程师-Linux介绍、命令
  7. 完美解决java.lang.OutOfMemoryError: bitmap size exceeds VM budget
  8. gtest 学习之五 测试用例中定义类
  9. 体操冠军江钰源:妈妈你不要去讨饭了
  10. python | 高效统计语言模型kenlm:新词发现、分词、智能纠错
  11. (原创)倾情奉献由测试兵团整理的cmh格式测试管理资料
  12. 简单工厂模式和策略模式的区别
  13. 什么是设计思维Design Thinking——风靡全球的创造力培养方法
  14. 如何使用project制定项目计划?(附详细步骤截图)
  15. Linux 桌面玩家指南:03. 针对 Gnome 3 的 Linux 桌面进行美化
  16. hdu 6194string string string 后缀自动机
  17. 量子信息与量子计算_我们会看到量子计算革命吗?
  18. MySQL 教程(一)
  19. C/C++ 小型餐馆订餐管理系统
  20. Clone Graph问题及解法

热门文章

  1. BFS宽度优先搜索(新冠病毒的传播)
  2. SCU2016-04 F题 (大模拟)
  3. HDS设备高级操作_VSP_更换Cache电池手册
  4. 灭火机器人C语言程序,- 一款基于STM32的智能灭火机器人设计
  5. # SIGPROC --- 脉冲星信号处理程序-详解
  6. 磁盘显示无法访问数据错误循环冗余检查的资料恢复法子
  7. latex插图编号_LaTex技巧[26]:Latex重新为图片编号
  8. 5千字长文:KeePass完全入门指南(附已经配置好的版本)
  9. valgrind内存泄露和线程竞态检测
  10. 各种快捷键组合操作让Spotlight搜索变得无比强大