我有期貨清單,在完成每個未來時,我有一個應該執行的回調。番石榴期貨等待回調
我正在使用Futures.successfulAsList檢查是否所有期貨都已完成。但是,這並沒有考慮到回調的完成。
有沒有一種方法可以確保回調完成?
而不是回調,我可以使用Futures.transform包裝到另一個未來並檢查完成。但是,有了這個,我無法訪問在包裝未來中拋出的運行時異常。
ListeningExecutorService service = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(20));
List<ListenableFuture<Object>> futures = new ArrayList<>();
for (int i = 1; i <= 20; i++) {
final int x = i * 100;
ListenableFuture<Object> future = service.submit(new Callable() {
@Override
public Object call() throws Exception {
Thread.sleep(10000/x);
return x;
}
});
futures.add(future);
Futures.addCallback(future, new FutureCallback<Object>() {
@Override
public void onFailure(Throwable t) {
t.printStackTrace();
}
@Override
public void onSuccess(Object x) {
try {Thread.sleep((Integer) x * 10);} catch (Exception e) {}
System.out.println(x);
}
});
}
ListenableFuture<List<Object>> listFuture = Futures
.successfulAsList(futures);
System.out.println("Waiting...");
System.out.println(listFuture.get());
System.out.println("Done");
這是一個真正偉大的問題,因爲它在我看來,它可能是不直接由番石榴API支持的一個相當常見的情況。 –