首页 文章

Java Future异步?

提问于
浏览
-2

来自Java doc:

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

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

1 回答

  • 2

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

    definition of asynchronous operation . 该术语指的是时间,而不是协调技术 .

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

    调用者会自动了解完成情况,结果如下 . 这是错的吗?

    是的,那是错的 . The delegated task may have nothing to do with the originating thread/object . 原始线程/对象可能对任务的完成没有兴趣,如果是这种情况,当然不希望以任何方式中断 .

    即使始发线程确实关心委托任务的完成,根据定义异步也不会定义通知原始线程的载体 . 在C风格编码的旧时代,通常定义了回调函数 . 在_2639133中,存在可以通知始发对象的各种技术 . 其中一种技术是让原始对象通过询问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 实现 .

相关问题