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

这是我的代码。

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


其中GetingDataDaemon类为:

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;

}


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

怎么了?

最佳答案

按照惯例,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()返回之后,就不再需要等待终止了。

关于java - 与return并发调用两个线程,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40872235/

10-11 03:30