来自Java doc:
Future表示异步计算的结果。提供方法来检查计算是否完成,等待其完成,以及检索计算结果。
如果有等待完成的方法,那么它是如何异步的?我对异步操作的理解是调用者可以只调用它,然后转移到其他任务。并且调用者会自动了解完成情况,结果。这是错的吗?
答案 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
出现了:它为同步计算(线程)提供了异步操作的结果。