繁体   English   中英

如何使用Unirest并行发送多个异步请求

[英]How to send multiple asynchronous requests in parallel using Unirest

在使用Unirest时,直到我们通过调用Unirest.shutdown()手动关闭每个线程后,程序才会退出。 如果我只需要提出一个请求,这很容易:

private static void asyncRequest (String link) {
    try {
        Future <HttpResponse <JsonNode>> request = Unirest.head(link).asJsonAsync(
                new Callback<JsonNode>() {
                    @Override
                    public void completed(HttpResponse<JsonNode> httpResponse) {
                        print(httpResponse.getHeaders());
                        try {
                            Unirest.shutdown();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }

                    @Override
                    public void failed(UnirestException e) {
                        print(e.getMessage());
                    }

                    @Override
                    public void cancelled() {
                        print("Request cancelled");
                    }
                }
        );

    } catch (Exception e) {
        e.printStackTrace();
    }
}

public static void main(String[] args) throws Exception {
   asyncRequest("https://entrepreneur.com");
}

但是我必须并行发出多个HTTP请求(后续的请求不应等待先前的请求完成)。 在上面的代码中,我必须使用不同的link多次在asyncRequest执行代码。 问题是我无法确定何时调用Unirest.shutdown()以便程序在最后一个请求收到响应后立即退出。 如果在mainasyncRequest所有调用之后都调用Unirest.shutdown() ,则某些或所有请求可能会被中断。 如果我在completed (和其他重写的方法)内部调用它,则仅发出第一个请求,而其他请求被中断。 我该如何解决?

从理论上讲,您可以让当前线程等待方法的执行,并在完成所有操作后调用关闭程序。 但这会使整个过程同步,这不是我们想要的。 所以我要做的是,运行不同的线程(主线程除外),该线程将等待所有http请求的执行。 为此,您可以使用CountDownLatch类,在将控件释放到父线程之前,先用倒数计时初始化。 您将CountDownLatch的实例传递给async方法,并在每次完成http请求时减少by one 当它达到0时,它将控制权返回给父线程,在此您可以在所有请求完成后调用shutdown方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM