![](/img/trans.png)
[英]Making asynchronous requests using Unirest returns ZipException: Not in GZIP format
[英]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()
以便程序在最后一個請求收到響應后立即退出。 如果在main
對asyncRequest
所有調用之后都調用Unirest.shutdown()
,則某些或所有請求可能會被中斷。 如果我在completed
(和其他重寫的方法)內部調用它,則僅發出第一個請求,而其他請求被中斷。 我該如何解決?
從理論上講,您可以讓當前線程等待方法的執行,並在完成所有操作后調用關閉程序。 但這會使整個過程同步,這不是我們想要的。 所以我要做的是,運行不同的線程(主線程除外),該線程將等待所有http請求的執行。 為此,您可以使用CountDownLatch
類,在將控件釋放到父線程之前,先用倒數計時初始化。 您將CountDownLatch
的實例傳遞給async
方法,並在每次完成http請求時減少by one
。 當它達到0時,它將控制權返回給父線程,在此您可以在所有請求完成后調用shutdown
方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.