多线程之Future源码解读
网站首页 文章专栏 多线程之Future源码解读
多线程之Future源码解读
编辑时间:2019-05-22 10:52 作者:毛毛小妖 浏览量:120 评论数:0

      Future组件展现异步计算的结果。Future提供了一些方法来判断计算是否完成、等待计算完成和返回计算的结果。当计算完成时,计算的结果只能通过get方法返回,必要的时候可以进行阻塞直到准备就绪。可以通过cancel方法来取消任务。还有一些其他的方法可以用来判断任务是否正常完成或者是否被取消了。一旦计算完成,任务就不能被取消了。如果你为了取消任务的特性想使用Future组件而不提供可用的返回结果,你可以声明Future<?>的类型并且返回null作为任务的返回结果。

Future使用例子 

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的一种实现,而FutureTask实现了Runnable接口,所以也可以执行Executor的execute方法。因此上面的submit结构可被替换为:

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

由于内存一致性的影响,在其他线程中也能调用Future.get()方法来获取计算结果。

下面我们来看一下Future类提供的方法:

1、boolean cancel(boolean mayInterruptIfRunning);

这个方法试图取消任务的执行。如果任务已经完成、已经被取消或者因为其他原因不能被取消,则会返回false。当任务还没启动的时候,就调用了cancel方法,则这个任务永远不会启动。如果任务已经启动了,那么mayInterruptIfRunning参数决定了正在执行任务的线程是否被中断。cancel方法执行之后,再调用isDone方法或者isCancelled,将会一直返回true。

2、boolean isCancelled();

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

3、boolean isDone();

如果任务完成则返回true

4、V get() throws InterruptedException, ExecutionException;

等待计算结束并返回计算结果

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

如果任务在给定时间计算结束则返回结果,否则会抛出异常

来说两句吧
最新评论
    还没有人评论哦,快来坐沙发吧!