我正在集成一個我無法控制的遺留庫。如何處理失敗的期貨
它具有以下接口中定義:
interface Factory {
Future<Void> subscribe(Context c);
}
此「訂閱」方法經常與不同線程調用。當我關心「Future.get()」的結果時唯一的情況是失敗時,我可以獲取並處理異常。這不必在調用線程中發生。另外,在我的情況下,阻止「Future.get()」上的調用線程可能會非常昂貴,因爲即使成功完成也可能需要幾秒鐘才能完成填充。
所以我的任務是以某種方式「後處理」所有這些未來,過濾失敗的。基本上,我可以看到兩種可能的方法:
方法1:
在獲得未來的一個實例,提出獨立的Runnable外部執行程序,它會做必要的:
executor.submit(
new Runnable(){
@Override
public void run() {
try {
future.get();
} catch(Exception e){
// process the exception
}
}
}
);
缺點這種方法是我們仍然在一段時間內阻塞線程。正如我所說的,這段代碼將會被頻繁執行。
方法2:
在獲得未來的一個實例,其放置一些收集和奉獻一個獨立的單一線程將定期通過做處理這個集合的元素運行:
while(true){
Iterator<Future<Void>> iterator = collection.iterator();
while(iterator.hasNext()){
Future<Void> future = iterator.next();
if(future.isDone()){
try {
future.get();
} catch(Exception e){
// process the exception
} finally {
iterator.remove();
}
}
}
TimeUnit.MILLISECONDS.sleep(1000); // sleep
}
你怎麼看?有沒有更好的方法來解決這個問題?