2008-11-10 95 views
2

比方說,我做一些在Java中,如:處理超時的FutureTask

 

RemoteResponse response = null; 
try { 
    FutureTask task new FutureTask(....); 
    executor.execute(task); 
    response = task.get(1000, TimeUnits.MILLISECONDS); 
} 
catch(TimeoutException te) { 
     .. should I do something special here? ... .. what happens to the return value of the task if task.get() throws an exception? ... .. is it ever garbage collected? ..  
} 
 

我的問題是沒有東西不放的情況下RemoteResponse其中TimeoutException異常被拋出?它會收集垃圾嗎?我是否必須在任務上調用cancel()方法才能發生?

回答

3

編輯的問題進行了修改後:

response是一個RemoteResponsetask負責分配的參考。如果方法拋出異常,則不會發生方法返回值的分配,因此不需要對response進行特殊處理。

task在超出範圍時將被重新引用,通過正常執行或引發異常。

如果task分配的資源應該封裝,即沒有外接舉行引用和被釋放(closerelease,等等),那麼就應該是沒有資源的泄漏。

除非有一些共享資源task具有專有的或其他應用程序需要的其他可用資源,否則無需調用取消。

我至少要記錄下任務在分配時間內沒有完成的事實。你做什麼取決於你的應用程序的要求。

請注意,task將繼續執行直至完成,無論get呼叫如何。

1

我認爲要看問題的方法是你需要在FutureTask之外聲明資源,這樣當你決定取消它時,你可以強制回收資源。

這樣:

Resource res = null; 
try { 
resource = ResourceAquirer.claim() 

FutureTask<?> task = new FutureTask<?>(resource); 
executor.execute(task); 
response = task.get(1000, TimeUnits.MILLISECONDS); 
} catch (Exception e) { 
    // logging 
} finally { 
if (resource != null) { 
    resource.release(); 
} 
} 

這樣你可以肯定的是,資源將被釋放。令人沮喪的是,所有這些都不能在未來的任務中被封裝,但是我無法找到在未來任務中調用取消的證明將確保在FutureTask內部調用finally塊。 (也許我會問,作爲另一個問題)

+0

這看起來像一個很好的方法。 – Dave 2009-09-17 03:33:28