2008-11-10 96 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