多线程FutureTask,看完这篇就够了

1 篇文章 0 订阅
1 篇文章 0 订阅


      笔者今天学习FutureTask包装器,简单点讲该包装器就是对底层线程任务执行的包装,包括返回值,异常抛出等。比如说我们现在有个任务需要交个run方法进行执行,这时候我们调用Thread的start方法,然后JVM开启一个线程帮我们执行该方法,但是run返回值为void,并且不能抛出异常,这是就需要包装器对其进行包装。今天笔者就来自己实现下FutureTask简单的底层实现原理。

  1. 首先创建MyCallable接口,添加未实现的myCall的方法该方法返回T类型的返回值,后面交给自定义MyFutureTask任务包装器执行。

  1. 编写MyFutureTask类实现Runnable接口,为什么实现这个接口呢,因为我们需要将myCall接口交给JVM底层的线程去执行。通常Thread的构造函数会传入Runnable接口进去。然后调用Runnable的run方法。等会我们也需要开启一个线程传入MyFutureTask对象进行。让底层开启一个线程帮我们执行MyFutureTask的fun方法。

  1. MyFutureTask里面需要对MyCallable进行引用,并且通过构造方法对其进行赋值,在MyFutureTask的run方法对MyCallable的myCall方法进行执行。myCall有返回值所以我们需要定义个全局的结果来对其进行存储。但是我们如何判断当前线程是否执行完毕,所以我们引入了一个简单的线程状态(当然真正的底层线程状态会比较多)只有NEW和COMPLETE,NEW表示线程创建并且任务还未执行完,COMPLETE表示线程已经执行完任务。

  1. MyFutureTask的重写Runnable的run方法,调用myCallable的myCall的方法执行任务,并获取返回结果。这里JVM底层会开启一个线程帮我们执行run方法。

  1. FutureTask的会提供get来获取任务执行结果,所以我们也简单模拟了get的实现原理。在get方法中我们去判断线程任务的执行状态,如果状态为COMPLETE则将结果返回出去,如果不为COMPLETE则当前线程调用wait方法进入等待状态。(注意这里其实有两个不同的线程。通常主线程会执行get方法,而另外一个线程执行run方法。)

  1. 接着在run方法中如果线程任务执行完后,这修改其状态为COMPLETE,并唤醒等待的线程。这里涉及到了线程的通讯,我只简单的提一下,后续会有专题进行记录。

  1. 最后进行测试






  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值