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类粗略解析_第1张图片

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

  • 重点!重点!

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

    • 在FutureTask的run方法的实现中调用真实的Callable任务,并把Callable的call方法的返回结果赋给FutureTask对象的outcome属性,这样就获取到了子线程的运算结果;FutureTask类粗略解析_第2张图片

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

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

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

你可能感兴趣的:(jdk)