我搜索过stackoverflow但我可以使用ListenableFuture或类似的东西找到任何答案。这就是我想要做的事情:
我有50个webservice API。我想打电话给他们,每个人都是单独的线程&将他们的回复放在地图中,其中密钥是API&的URL。价值就是回应。问题是当我在第1行和第3行提供调试器时(在代码片段中提到)然后一切运行正常。但如果没有调试器,我会得到一个错误的'在'第2行'即没有填充HashMap。我尝试过以下方法:
显然,这是在当前线程继续执行第1行和第1行时发生的。 2,而其他线程仍在工作。但我不知道如何使当前线程等待其他线程完成其处理。
另一个问题:如果其中一个API需要花费太多时间,那么我该如何停止等待它呢?取消它&继续我所拥有的。 我尝试过以下方法:
for (final StringBuilder url : urlList) {
final URIBuilder uriBuilder = new URIBuilder(url.append(new AuthKeyGenerator().getKey()).toString());
final ListenableFuture<String> response = pool.submit(new Callable<String>() {
@Override
public String call() throws Exception {
ClientResource clientResource = new ClientResource(uriBuilder.build());
clientResource.setResponseEntityBuffering(true);
String response = clientResource.get(String.class);
return response;
}
});
Futures.addCallback(response, new FutureCallback<String>() {
public void onSuccess(String response) {
final UrlResponse urlResponse = new UrlResponse();
urlResponse.setProdResponse(response);
urlResponseMap.put(url.toString(), urlResponse);
}
public void onFailure(Throwable thrown) {
//logger.warn(".......sections of term failed {}", thrown);
}
}, MoreExecutors.sameThreadExecutor());
}
Set<String> set = urlResponseMap.keySet();-----------Line 1
System.out.println("********"+ set.isEmpty());-------Line 2