2015-05-11 16 views
5

Ich muss einen Weg finden, um von Future zu ListenableFuture konvertieren. Derzeit verwende ich einen Dienst, der Future zurückgibt, aber ich muss einen Hörer anschließen. Ich kann die Service-Schnittstelle nicht ändern, da sie mir nicht gehört.wie man Java Future <V> in Guave konvertiert ListenableFuture <V>

Gibt es eine einfache Möglichkeit, das zu tun?

Ich habe Guava Docs gelesen, aber ich kann immer noch keinen Weg finden, es zu tun.

+0

Woher kommt deine 'Zukunft'? Geht es von einem 'ExecutorService'? – Will

+0

Ich wäre überrascht, wenn es eine gute Möglichkeit gäbe, dies zu tun, ohne einen eigenen Thread zu erstellen; 'ListenableFuture' ist strikter als' Future'. –

+0

@Will my Future stammt von https://cloud.google.com/appengine/docs/java/javadoc/com/google/appengine/api/urlfetch/URLFetchService#fetchAsync(com.google.appengine.api.urlfetch). HTTPRequest). Ich konnte keinen besseren Weg finden, urls asynchron von gae/j zu holen. – justatester

Antwort

14

Guava stellt die JdkFutureAdapters Typen für diese Konvertierung bereit. Die API heißt

Dienstprogramme, die für die Arbeit mit Bibliotheken, die Ebene Zukunft Instanzen liefern.

Zum Beispiel

Future<?> future = ...; 
ListenableFuture<?> listenable = JdkFutureAdapters.listenInPoolThread(future); 

Aber Sie sollten es mit Vorsicht verwenden: es ist schwer hörbare Zukunft zu emulieren, wenn Sie bereits Aufgabe abgegeben haben, denn es gibt keine Möglichkeit, einen Haken zu setzen ist auf Abschluss dort, so Guava nimmt einen neuen Thread und blockiert dort, bis Original Future abgeschlossen ist.

Das Guava Wiki auch contains some information on this specific case.

+0

@qwwdfsad ok. Das habe ich nicht gesehen. Ich werde es versuchen. – justatester