FutureTask类粗略解析

概要

看了一下FutureTask的源码,了解了其内部原理,这里记录下。

作用

  • 其主要作用是跟踪线程的执行状态、取消任务(中断线程),以及获取执行结果;

继承关系

  • FutureTask实现了接口RunnableFuture,RunnableFuture接口继承了Runnable和Future接口;
  • Runnable定义run方法,定义了多线程要执行的任务;
  • Future定义了cancel、isCancel、get、isDone等方法,主要作用就是跟踪线程的执行状态、取消任务,以及获取执行结果;

实现原理

  • 我们在通过submit方法提交任务的时候,会把传入的Callable(或者是Runnable,但Runnable最终会被RunnableAdapter适配为一个Callable对象)任务封装到FutureTask中,由于FutureTask实现了Runnable接口,所以它本身就是一个Runnable对象(代理模式);在这里插入图片描述

  • 在创建好FutureTask对象后,通过execute方法来执行FutureTask对象任务,然后立即返回FutureTask对象;

  • 重点!重点!

    • 由于FutureTask作为Runnable对象传入子线程中执行,所以此时FutureTask对象就成为了主线程与子线程的共享对象;

    • 在FutureTask的run方法的实现中调用真实的Callable任务,并把Callable的call方法的返回结果赋给FutureTask对象的outcome属性,这样就获取到了子线程的运算结果;在这里插入图片描述

    • 在子线程调用FutureTask的run方法时,会把子线程的Thread对象引用赋给FutureTask的runner属性,这样就实现了获取子线程的状态以及运算结果;

  • FutureTask的cancel方法就是直接调用子线程的中断方法interrupt(),若Callable的call方法中未对中断进行响应,实际上是无法取消子线程的任务的;具体的取消操作还需要我们通过判断线程的中断状态来自己定义;

  • 注意:调用Future的get方法时,若任务没有执行完成则会被awaitDone方法阻塞,直至完成;其阻塞是通过private int awaitDone(boolean timed, long nanos)方法来完成的;

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值