Future源码解读

〇、[源码版本] jdk 1.8

一、Future概述

Future表示异步计算的结果。提供了检查计算是否完成、等待计算完成以及检索计算结果的方法。

结果只能在计算完成后使用方法get取回,必要时阻塞,直到它准备好。

取消由cancel方法执行。

提供了其他方法来确定任务是正常完成还是被取消。计算一旦完成,就不能取消计算。

如果您想使用Future来实现可取消性,但不提供可用结果,您可以声明Future<?>形式的类型并返回null作为基础任务的结果。

[举例1]示例代码

   interface ArchiveSearcher { String search(String target); }

  class App {
    ExecutorService executor = ...
    ArchiveSearcher searcher = ...
    void showSearch(final String target) throws InterruptedException {
        
      Future<String> future = executor.submit(new Callable<String>() {
          public String call() {
              return searcher.search(target);
      	  }
      });
          
     displayOtherThings(); // 在处理search的时候,异步处理其他事
      
     try {
        displayText(future.get()); // 使用future
      } catch (ExecutionException ex) { 
      		cleanup(); return; 
      }
    }
  }

FutureTask类是Future的实现,它实现了Runnable,因此可以由Executor执行。例如,上面带有submit的构造可以替换为

[举例2]示例代码

FutureTask<String> future = new FutureTask<String>(new Callable<String>() {
      public String call() {
        return searcher.search(target);
    }});
  executor.execute(future);

内存一致性影响

异步计算采取的动作,内存可见性发生在另一个线程中对应Future.get()的操作之前。

二、Future接口的方法

cancel方法

boolean cancel(boolean mayInterruptIfRunning);

尝试取消此任务的执行。

如果任务已完成、已被取消、或由于某些其他原因无法取消,则此尝试将失败。

如果成功,并且在调用cancel时此任务尚未启动,此任务不应运行。

如果任务已经开始,那么mayInterruptIfRunning参数确定执行此任务的线程是否应该在尝试停止任务时被中断。

a.参数:
mayInterruptIfRunning 执行此任务的线程是否应该被中断;否则,允许进行中的任务完成
b.返回:
true 任务取消执行
false 如果任务无法取消,通常是因为它已经正常完成
c.异常:无

isCancelled方法

boolean isCancelled();

如果此任务在正常完成之前被取消,则返回true

a.参数:无
b.返回:
true 如果此任务在正常完成之前被取消
c.异常:无

isDone方法

boolean isDone();

如果此任务完成,则返回true。完成可能是由于正常终止、异常或取消——在所有这些情况下,此方法将返回true

a.参数:无
b.返回:
true 如果此任务完成
c.异常:无

get方法

V get() throws InterruptedException, ExecutionException;

如有必要,等待计算完成,然后取回其结果。

a.参数:无
b.返回:
V 计算结果
c.异常:
throws CancellationException 如果计算被取消
throws ExecutionException 如果计算抛出异常
throws InterruptedException 如果当前线程在等待时被中断

V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException;

如有必要,最多等待给定的计算时间完成,然后取回其结果(如果可用)。

a.参数:
timeout 最长等待时间
unit 超时参数timeout的时间单位
b.返回:
V 计算结果
c.异常:
throws CancellationException 如果计算被取消
throws ExecutionException 如果计算抛出异常
throws InterruptedException 如果当前线程在等待时被中断
throws TimeoutException 如果等待超时

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值