JDK7中Future,FutureTask和RunnableFuture源码概述

来源:互联网 发布:股票行情软件哪家好 编辑:程序博客网 时间:2024/06/10 04:42
ExecutorService的submit()方法可以返回Future对象,Future<V>是java.util.concurrent下的包, V是Future的get方法所返回的结果类型。所有已知子接口:Response<T>,RunnableFuture<V>,RunnableScheduledFuture<V>,ScheduledFuture<V>;所有已知实现类:FutureTask,SwingWorker。

Future表示异步计算的结果。它提供了检查计算是否完成的方法,以等待计算的完成,并获取计算的结果。计算完成后只能使用get方法来获取结果,如有必要,计算完成前可以阻塞此方法。取消则由cancel方法来执行。还提供了其它方法,以确定任务是正常完成还是被取消了。一旦计算完成,就不能再取消计算。如果为了可取消性而使用Future但又不提供可用的结果,则可以声明Future<?>形式类型,并返回null作为底层任务的结果。

用法示例:
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(); // do other things while searching
   try {
     displayText(future.get()); // use future
   } catch (ExecutionException ex) { cleanup(); return; }
 }

}


FutureTask类是Future的一个实现,Future可实现Runnable,所以可通过Executor来执行。例如,可用下列内容替换上面带有submit的构造:
FutureTask<String> future=new FutureTask<String>(new Callable<String>() {
  public String call() {
    return searcher.search(target);
  }
});
executor.execute(future);
内存一致性效果:异步计算采取的操作happen-before另一线程中紧跟在相应的Future.get()之后的操作。

FutureTask<V>是java.util.concurrent包下的实现类,V表示FutureTask的get方法所返回的结果类型。所有已实现的接口:Runnable,Future<V>,RunnableFuture<V>。FutureTask<V>是可取消的异步计算。利用开始和取消计算的方法,查询计算是否完成的方法和获取计算结果的方法,此类提供了对Future的基本实现。仅在计算完成时才能获取结果;如果计算尚未完成,则阻塞get方法。一旦计算完成,就不能再重新开始或取消计算。可使用FutureTask包装Callable或Runnable对象。因为FutureTask实现了Runnable,所以可将FutureTask提交给Executor执行。除了作为一个独立的类外,此类还提供了protected功能,这在创建自定义任务类时可能很有用。

RunnableFuture<V>是java.util.concurrent包下的接口,V表示此Future的get方法所返回的结果类型。所有超级接口:Future<V>,Runnable;所有已知子接口:RunnableScheduledFuture<V>;所有已知实现类:FutureTask,SwingWorker。RunnableFuture<V>作为Runnable的Future。成功执行run方法可以完成Future并允许访问其结果。RunnableFuture<V>提供了void run()方法来实现在未被取消的情况下,将此Future设置为计算的结果。

实现可参考:https://github.com/chunericli/wise-utils
原创粉丝点击