使用return同时调用两个线程

时间:2016-11-29 17:37:47

标签: java multithreading

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

这是我的代码。

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;

}

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

有什么问题?

2 个答案:

答案 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()返回后的情况下,不再需要等待终止。