如何使用ListenableFuture Spring使当前线程等待其他线程响应

时间:2017-06-08 09:51:39

标签: java spring multithreading web-services

我搜索过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

0 个答案:

没有答案