如何使用Unirest

时间:2018-02-12 09:09:29

标签: java multithreading asynchronous 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请求(后续请求意味着不要等待先前的请求完成)。在上面的代码中,我必须使用不同的asyncRequest多次在link内执行代码。问题是我无法决定何时调用Unirest.shutdown(),以便程序在最后一个请求收到响应后立即退出。如果我在Unirest.shutdown()中对asyncRequest的所有调用后拨打main,则部分或全部请求可能会被中断。如果我在completed(以及其他重写方法)中调用它,则只会发出第一个请求而其他请求会被中断。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

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