来自Java doc:
Future表示异步计算的结果 . 提供方法以检查计算是否完成,等待其完成,以及检索计算结果 .
如果有等待完成的方法,那么它是如何异步的?我对异步操作的理解是调用者可以只调用它,然后转移到其他任务 . 并且调用者会自动了解完成情况,结果 . 这是错的吗?
我对异步操作的理解是调用者可以只调用它,然后转移到其他任务 .
见definition of asynchronous operation . 该术语指的是时间,而不是协调技术 .
由其他线程在后台完成的任务随时发生 . 与原始线程协调是一个无关的问题,“异步”术语既不要求也不否认 . 所以是的,在后台线程执行委派任务时,原始线程/对象可以继续执行其他工作 . 可以或可以不通知始发线程/对象任务的完成 .
调用者会自动了解完成情况,结果如下 . 这是错的吗?
是的,那是错的 . The delegated task may have nothing to do with the originating thread/object . 原始线程/对象可能对任务的完成没有兴趣,如果是这种情况,当然不希望以任何方式中断 .
即使始发线程确实关心委托任务的完成,根据定义异步也不会定义通知原始线程的载体 . 在C风格编码的旧时代,通常定义了回调函数 . 在_2639133中,存在可以通知始发对象的各种技术 . 其中一种技术是让原始对象通过询问Future来检查任务的状态 .
这在 Future 类doc中显示的示例代码中进行了演示:
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带来了新的有用的 Future 实现 .
1 回答
见definition of asynchronous operation . 该术语指的是时间,而不是协调技术 .
由其他线程在后台完成的任务随时发生 . 与原始线程协调是一个无关的问题,“异步”术语既不要求也不否认 . 所以是的,在后台线程执行委派任务时,原始线程/对象可以继续执行其他工作 . 可以或可以不通知始发线程/对象任务的完成 .
是的,那是错的 . The delegated task may have nothing to do with the originating thread/object . 原始线程/对象可能对任务的完成没有兴趣,如果是这种情况,当然不希望以任何方式中断 .
即使始发线程确实关心委托任务的完成,根据定义异步也不会定义通知原始线程的载体 . 在C风格编码的旧时代,通常定义了回调函数 . 在_2639133中,存在可以通知始发对象的各种技术 . 其中一种技术是让原始对象通过询问Future来检查任务的状态 .
这在
Future
类doc中显示的示例代码中进行了演示:请注意,Java 8带来了新的有用的
Future
实现 .