我试图并行调用两个线程。 他们每个人都必须返回一个哈希表。
这是我的代码。
ExecutorService executor = Executors.newFixedThreadPool(2);
Future<Map<Object, Map<String,Double>>> task1 = executor.submit(new GettingDataDaemon(request,0));
map = task1.get();
Future<Map<Object, Map<String,Double>>> task2 = executor.submit(new GettingDataDaemon(request,1));
map_compare = task2.get();
executor.shutdown();
while (!executor.isTerminated()) {
}
System.out.println("MAPS CREATED");
GetDataDaemon类是:
public class GettingDataDaemon implements Callable<Map<Object, Map<String,Double>>> {
HttpServletRequest request;
int index;
public GettingDataDaemon(HttpServletRequest request, int index){
this.request = request;
this.index = index;
}
@Override
public Map<Object, Map<String,Double>> call() {
AbstractClass absClass = new AbstractClass();
Map<Object, Map<String,Double>> map = absClass.getData(request, index);
System.out.println("Returning map "+(index+1)+"...");
return map;
}
我测试了我的代码,但第二个线程在第一个线程结束后开始。
有什么问题?
答案 0 :(得分:2)
由于task1.get()
的调用,您的代码正在等待完成第一项任务。看看文档:
V get():如果需要等待计算完成,然后检索其结果。
https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Future.html#get()
答案 1 :(得分:1)
正如已确定的那样,Future.get()
是一个阻止通话,因此除非计算结果,否则它不应该被调用,或者它是唯一的Future
左,你不要除了等待,还有其他事可做。
要并行执行守护进程,最简单的方法是切换一些行。
Future<Map<Object, Map<String,Double>>> task1 = executor.submit(new GettingDataDaemon(request,0));
Future<Map<Object, Map<String,Double>>> task2 = executor.submit(new GettingDataDaemon(request,1));
map = task1.get();
map_compare = task2.get();
executor.shutdown();
你也不想写一些像while(!executor.isTerminated())
一样愚蠢的东西,因为它会忙着循环并且完全没有理由燃烧CPU。使用executor.awaitTermination(60, TimeUnit.SECONDS))
(自然选择超时)。但是在task2.get()
返回后的情况下,不再需要等待终止。