我试图并行调用两个线程。
他们每个人都必须返回一个哈希表。
这是我的代码。
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/