【并发进阶】Future掌控未来之Callable跨线程返回结果和抛出异常的原理分析

我们知道线程的发起Thread.start() 实质上是,start()调用native方法 start0(), 然后唤起系统线程,在系统线程中回调 Runnable中的run()方法。而且整个过程是异步的,导致在Runnable的两个致命缺陷,第一个是不能返回结果,第二个是不能抛出异常。所以Java爸爸后来引入了Callable这个接口,这个接口旨在解决这两个缺陷。

至于怎么用Callable, 相信都已经轻车熟路了,作为一个高级程序员只知道怎么用是不够的,我们还需要知道为什么?那么我们先思考下面几个问题:

  1. call()方法是否也是和run()方法一样通过系统线程直接调用的?
  2. Callable是怎么把结果返回给主线程?
  3. Callable是怎么把异常抛出给主线程的?

相信在接下来的几分钟里,你会对Callable有全新的认识。

其实实现这些功能单单靠Callable一个接口是办不到的,还需要借助Future、FutureTask类来完成这个功能。

三个臭皮匠Future、FutureTask、Callable介绍

在介绍之前我们先来想一下,如果让你实现线程返回结果的功能你要怎么办?

如下图所示:

如图main线程中异步启动一个线程 Thread.start()事实上等线程执行完后,main线程早就结束了。所以说如果让我们来实现线程返回结果的功能我们得需要通过曲线救国的方式来实现,什么意思呢?

因为线程是异步的,要想获取结果,我们是不是需要阻塞主线程,然后等待线程结束后把结果回调到主线程上,自 Java 1.5 , Java爸爸给我们提供了一个接口Future,简单地说,Future类代表异步线程的未来结果。这个结果最终会在处理完成后出现在Future中。Future.get()方法就实现了阻塞的功能,具体可以看一下这个图

如图,main线程把任务FutureTask传给Thread, 并启动Thread.start(), 然后在run()方法中调用Callable.cal

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值