2015-05-11 8 views
5

Potrzebuję znaleźć sposób na konwersję z Future na ListenableFuture. Obecnie używam usługi, która zwraca Future, ale muszę podłączyć do niej słuchacza. Nie mogę zmienić interfejsu usługi, ponieważ nie należy on do mnie.Jak przekonwertować java Future <V> na guava ListenableFuture <V>

Czy istnieje prosty sposób na zrobienie tego?

Czytałem dokumenty z guawy, ale nadal nie mogę znaleźć sposobu, aby to zrobić.

+0

Skąd pochodzi twoja "Przyszłość"? Czy to z 'ExecutorService'? – Will

+0

Byłbym zaskoczony, gdyby istniał dobry sposób na zrobienie tego bez tworzenia własnego wątku; 'ListenableFuture' jest ściśle silniejszy niż' Future'. –

+0

@Will my Future pochodzi z https://cloud.google.com/appengine/docs/java/javadoc/com/google/appengine/api/urlfetch/URLFetchService#fetchAsync(com.google.appengine.api.urlfetch. HTTPRequest). Nie mogłem znaleźć lepszego sposobu na asynchroniczne pobieranie adresów URL z gae/j. – justatester

Odpowiedz

14

Guawa zapewnia typy JdkFutureAdapters dla tej konwersji. API stwierdza

Narzędzia niezbędne do pracy z bibliotekami, które zaopatrują zwykły Przyszłe instancji.

Na przykład

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

Ale należy używać go z rozwagą: trudno naśladować Listenable przyszłość kiedy już złożyli zadanie, ponieważ nie ma sposobu, aby umieścić hak na dokończenie, więc Guava bierze nowy wątek i blokuje go, dopóki nie zostanie ukończony oryginalny Future.

Guawa Wiki również contains some information on this specific case.

+0

@qwwdfsad ok. tego nie widziałem. spróbuję. – justatester

Powiązane problemy