簡體   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