【发布时间】:2015-09-14 12:32:30
【问题描述】:
在将其标记为重复之前,请仔细阅读问题。
下面是伪代码的sn-p。 我的问题是-下面的代码是否不会破坏并行异步处理的概念?
我问这个的原因是因为在下面的代码中,主线程将提交一个任务以在不同的线程中执行。在队列中提交任务后,它会阻塞 Future.get() 方法让任务返回值。我宁愿让任务在主线程中执行,而不是提交到不同的线程并等待结果。通过在新线程中执行任务我得到了什么?
我知道您可以等待有限的时间等,但是如果我真的关心结果怎么办?如果要执行多个任务,问题会变得更糟。在我看来,我们只是在同步进行工作。我知道提供非阻塞侦听器接口的 Guava 库。但我很想知道我对 Future.get() API 的理解是否正确。如果是正确的,为什么 Future.get() 被设计成阻塞从而破坏了并行处理的整个过程?
注意 - 为了记录,我使用 JAVA 6
public static void main(String[] args){
private ExectorService executorService = ...
Future future = executorService.submit(new Callable(){
public Object call() throws Exception {
System.out.println("Asynchronous Callable");
return "Callable Result";
}
});
System.out.println("future.get() = " + future.get());
}
【问题讨论】:
-
这个想法是您将提交多个任务然后等待。你是对的,如果你在提交每个任务之间等待结果,那么它们将被串行处理,你不会得到任何东西。
-
@SkinnyJ 如果提交了多个任务,你怎么知道返回的结果是针对哪个任务的?我如何等待多个任务?
-
@VishalP 然后您将获得期货列表,您可以使用 isDone() 检查或使用 get() 获取结果
-
最简单的就是使用invokeAll。否则,您可以在提交 Callable 时跟踪每个未来,并一个接一个地获取结果。无论哪种方式,处理都是并行进行的。
-
重要的是“get”不是开始执行,“submit”是,get只是“等待”结果。所以我们可以启动多个任务(多个执行器),然后在每个任务上使用 get。这样,所有的执行器将并行运行。如果您可以在没有结果而不是 get 的情况下继续,您可以使用观察者模式
标签: java multithreading asynchronous executorservice executor