代码之家  ›  专栏  ›  技术社区  ›  Mandroid

Java未来异步?

  •  1
  • Mandroid  · 技术社区  · 7 年前

    来自Java文档:

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

    如果有等待完成的方法,那么它是如何异步的呢?我对异步操作的理解是,调用者只需调用它,然后转移到其他任务。调用者会自动知道完成操作,并给出结果。这是错的吗?

    2 回复  |  直到 7 年前
        1
  •  4
  •   Alexei Kaigorodov    7 年前

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

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

    其他线程在后台执行的任务随时都会发生。与原始线程协调是一个不相关的问题,异步术语既不要求也不拒绝。因此,是的,当后台线程执行委托任务时,发起线程/对象可以自由地继续执行其他工作。原始线程/对象可能会收到任务完成的通知,也可能不会收到任务完成的通知。

    调用者会自动知道完成操作,并给出结果。这是错的吗?

    是的,那是错误的。 委派的任务可能与原始线程/对象无关 。发起线程/对象可能对任务的完成不感兴趣,如果是这样的话,肯定不希望以任何方式被中断。

    即使原始线程 关心委托任务的完成,定义为异步并不定义一个通知发起线程的工具。在旧的C风格编码中,通常定义回调函数。在里面 OOP 可以通过各种技术通知原始对象。其中一种技术是让原始对象通过询问 Future

    中所示的示例代码演示了这一点 将来 类别文档:

    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带来了新的、有用的 将来 实施。

        2
  •  0
  •   Alexei Kaigorodov    4 年前

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

    但同步和异步世界需要相互作用 Future 结果:它向同步计算(线程)提供异步操作的结果。