2013-04-30 47 views
3

我,但不知道是否有用於ListenableFuture工作方式類似於allAsList任何UTIL如果調用get(50, TimeUnit.Milliseconds)回報已經完成了所有。番石榴ListenableFuture allAsList返回從迄今所看到的所有內容得到

+0

你將如何實現這樣的事情失敗或取消? (我不知道它是否可行,但'Futures'中沒有什麼不可思議的 - 如果它在那裏,你可以自己實現它。) – 2013-04-30 21:32:32

+0

我打算如何做到這一點是將allAsList並重寫get(int,TimeUnit),當它超時返回值的列表。這感覺像是一個拙劣的解決方案,所以希望會有別的東西。在另一個項目中,我不得不做同樣的事情,並使用倒計時鎖存器來解決這個問題。每個回調都寫入列表中,如果等待超時,則取消所有剩餘的期貨並返回值列表。 – ekaqu 2013-04-30 21:53:28

+0

於是我分叉CombinedFuture和overrided得到。這感覺非常哈克和未測試,但這是我在尋找:https://gist.github.com/dcapwell/5492453 – ekaqu 2013-04-30 22:32:57

回答

0

沒有,但有可能在未來,我認爲答案在於there在此相關的問題了討論:有一種特殊的期貨#allAsList(),你可以的 ListenableFuture, FutureCallback and timeouts

基本上代替在所有期貨中添加一個超時回調,並在其上使用Futures#successfulAsList()。因此,每一個超時的未來都會因爲TimeoutException而失敗,並且Futures#successfulAsList()將只返回成功的那個,即不會以任何類型的異常(包括TimeoutException)失敗。

不幸的是,這還沒有在番石榴中實現(請參閱番石榴的跟蹤器問題的第一個鏈接),但至少已被接受爲有效請求。

-1

據我所知,Futures.successfulAsList會做一些你正在尋找的東西。從the documentation

創建一個新的ListenableFuture其值是包含所有成功輸入期貨

的值列表,以便調用

Futures.successfulAsList(myListOfFutures).get(50, TimeUnit.Milliseconds) 

將返回一個列表,其中每個元素要麼是:

  • 成功的結果l的Future
  • null運行時Future由於超時