Java Future异步?

时间:2018-03-14 03:09:48

标签: java asynchronous future

来自Java doc:

  

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

如果有等待完成的方法,那么它是如何异步的?我对异步操作的理解是调用者可以只调用它,然后转移到其他任务。并且调用者会自动了解完成情况,结果。这是错的吗?

2 个答案:

答案 0 :(得分:2)

  

我对异步操作的理解是调用者可以只调用它,然后转移到其他任务。

请参阅definition of asynchronous operation。该术语指的是时间,而不是协调技术。

由其他线程在后台完成的任务随时发生。与原始线程协调是一个无关的问题,“异步”术语既不要求也不否认。所以是的,在后台线程执行委派任务时,原始线程/对象可以继续执行其他工作。原始线程/对象可能会或可能不会被告知任务的完成。

  

调用者会自动知道完成情况,结果。这是错的吗?

是的,那是错的。 委派的任务可能与原始线程/对象无关。原始线程/对象可能对任务的完成没有兴趣,如果是这种情况,当然不希望以任何方式中断。

即使原始线程 关心委派任务的完成,根据定义异步也不会定义通知原始线程的载体。在C风格编码的旧时代,通常定义了回调函数。在OOP中,有各种技术可以通知原始对象。其中一种技术是让原始对象通过询问Future来检查任务的状态。

Future类doc:

中显示的示例代码对此进行了演示
interface ArchiveSearcher { String search(String target); }
class App {
  ExecutorService executor = ...
  ArchiveSearcher searcher = ...
  void showSearch(String target) throws InterruptedException {
    Callable<String> task = () -> searcher.search(target);
    Future<String> future = executor.submit(task);
    displayOtherThings(); // do other things while searching
    try {
      displayText(future.get()); // use future
    } catch (ExecutionException ex) { cleanup(); return; }
  }
}

请注意,Java 8带来了新的有用的Future实现。

答案 1 :(得分:0)

有异步计算和异步交互。通常,异步计算使用异步交互,而同步计算使用同步交互。同步计算是线程,同步交互是阻塞队列,信号量等。

但是同步世界和异步世界需要交互,因此Future出现了:它为同步计算(线程)提供了异步操作的结果。