Java ~ Executor ~ Future【总结】

前言


 文章

  • 相关系列:《Java ~ Executor【目录】》(持续更新)
  • 相关系列:《Java ~ Executor ~ Future【源码】》(学习过程/多有漏误/仅作参考/不再更新)
  • 相关系列:《Java ~ Executor ~ Future【总结】》(学习总结/最新最准/持续更新)
  • 相关系列:《Java ~ Executor ~ Future【问题】》(学习解答/持续更新)
  • 涉及内容:《Java ~ Executor【总结】》

一 概述


 简介

    Future(未来)可以代表任务,作为与任务进行交互的入口,用于追踪/获取任务的执行状态/结果。我们可以将未来理解为任务的载体,其内部关联着任务,代码中具体表现为实现类会组合Runnable(可运行)变量来持有任务的引用。正是因为任务本身存在于未来的内部(即封装),因此未来很轻松的对任务执行过程进行观察和干涉。事实上未来接口也确实定义了诸多方法,令开发者可以对原本被封闭的任务执行过程进行干预,例如取消、状态判断及获取结果等。

 结构

Java ~ Executor ~ Future【总结】_第1张图片

二 方法


  • boolean cancel(boolean mayInterruptIfRunning) —— 取消 —— 取消当前未来代表任务,取消成功则返回true;否则返回false。当代表任务结束(完成/异常/取消)时,由于已处于最终状态,代表任务将无法被取消,方法会返回false;而如果代表任务未结束(完成/异常/取消),则当『mayInterruptIfRunning @ 如果运行可能中断』为false时方法将阻止等待中的代表任务执行;而如果参数为true,则方法还将取消执行中的代表任务,即使代表任务可能无法响应取消。而只要取消操作(阻止/取消)成功执行,无论最终的结果如何,方法都将返回true。
        可以发现的是,cancel(boolean mayInterruptIfRunning)方法更多关注的是取消相关操作是否可以执行/是否成功执行(由于取消只能单次执行,因此并发可能导致失败),而并不关注取消相关操作执行后对代表任务的实际影响结果,特别是关于代表任务中断的部分。这实际上Java自身特性决定的,因为响应式中断的原因,代表任务的中断结果是无法预估的。这也就是说,只要取消相关操作可以成功执行,则无论代表任务最终的取消结果如何,其都会转变为取消状态。

  • boolean isCancelled() —— 是否取消 —— 判断当前未来代表任务是否取消,是则返回true;否则返回false。

  • boolean isDone() —— 是否结束 —— 判断当前未来代表任务是否结束(完成/异常/取消),是则返回true;否则返回false。

  • V get() —— 获取 —— 获取当前未来代表任务的执行结果,在代表任务未结束(完成/异常/取消)之前,方法会无限等待。而根据代表任务最终状态的不同,方法会返回正常的执行结果,或抛出执行异常(代表任务自身执行时出现的异常)、取消异常(代表任务因cancel(boolean mayInterruptIfRunning)方法而被取消)及中断异常(采用非cancel(boolean mayInterruptIfRunning)方法的方式中断执行代表任务的线程)。

  • V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException —— 获取当前未来代表任务的执行结果,在代表任务未结束(完成/异常/取消)之前,方法会有限等待指定时间,超出指定等待时间将抛出超时异常。而根据代表任务最终状态的不同,方法会返回正常的执行结果,或抛出执行异常(代表任务自身执行时出现的异常)、取消异常(代表任务因cancel(boolean mayInterruptIfRunning)方法而被取消)及中断异常(采用非cancel(boolean mayInterruptIfRunning)方法的方式中断执行代表任务的线程)。

你可能感兴趣的:(Java,#,Executor,java,开发语言,Future,Executor)