2016-09-02 4 views
1

Wenn ich ein ListenableFuture<X> beim Aufruf eines externen Systems mit der AsyncHttpClient, und ich rufe get() sofort - wird der aktuelle Thread nicht warten, bis der asynchrone Thread mit einer Antwort bereit ist? Wenn das stimmt, was ist der Vorteil der Verwendung von AsyncHttpClient?get() sofort nach Erhalt ListenableFuture

AsyncHttpClient httpClient = new AsyncHttpClient(); 
ListenableFuture<Response> futureResponse = httpClient.execute(url, payload, headers); 

// If this is immediately on next line, am I getting any benefit? 
Response response = futureResponse.get(); 
+1

Ja, es wird warten bis die 'Zukunft' abgeschlossen ist. AsyncHttpClient hat hier keinen Vorteil. –

+0

Wenn Sie zwei oder mehr Anfragen gleichzeitig ausführen möchten, können Sie sie gleichzeitig ausführen und darauf warten, dass sie abgeschlossen werden. Dies dauert nur so lange wie die Anforderung mit der längsten Dauer und nicht die Gesamtzeit aller zusammengesetzten Anforderungen. –

+0

Wenn ich pro Hauptthread eine asynchrone Anfrage gestellt habe - bleibt dann jeder Hauptthread blockiert, bis async IO abgeschlossen ist? Bedeutet das - ich kann keinen asynchronen Client nutzen? – DanglingPointer

Antwort

5

Pro den Future Schnittstelle Vertrag, das ListenableFuture Arbeitsgeräte, get() das Ergebnis der Future zurückkehrt, und thusly blockieren müssen, bis notwendige Berechnungen abgeschlossen sind.

get() ausführen sofort nach einem Future Aufruf würde Ihnen keinen Vorteil geben, wenn System A System B mit einer asynchronen Anforderung anruft, ruft direkt danach wird System A warten.

Wenn Sie möchten, dass System A während der Verarbeitung der Anforderung weiterhin Aufgaben ausführt, möchten Sie vielleicht einen Callback oder Listener zur ListenableFuture hinzufügen, damit A das tun kann, was B tun muss, wenn B zurückkommt ist dies der Grund, warum ListenableFuture tatsächlich existiert).

Verwandte Themen