2016-11-29 48 views
0

我正在尝试并行调用两个线程。 他们每个人都必须返回一个哈希表。同时调用两个线程并返回

在这里我的代码。

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"); 

其中GettingDataDaemon类:

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; 

} 

我测试了我的代码,但第二个线程开始第一个结束之后。

出了什么问题?

回答

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()返回后,不再需要等待终止。

相关问题