2

Javaで次のようなことをするとしましょう:


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? ..
   
}

私の質問は、TimeoutException がスローされた場合に RemoteResponse に何かが保持されますか? ガベージコレクションされますか?そのためには、タスクで cancel() メソッドを呼び出す必要がありますか?

4

2 に答える 2

3

質問が改訂された後に編集します。

responseRemoteResponse割り当てをtask担当するへの参照です。メソッドが例外をスローした場合、メソッドからの戻り値の割り当ては行われないため、response.

task通常の実行または例外がスローされた場合に、スコープ外になると参照されなくなります。

によって割り当てられたリソースtaskが適切にカプセル化されている場合、つまり、外部に保持されている参照がなく、解放されている場合 ( closereleaseなど)、リソースのリークはありません。

task排他的に持つ共有リソースまたはアプリケーションの残りの部分が必要とするその他の消費可能なリソースがない限り、キャンセルを呼び出す必要はありません。

少なくとも、タスクが割り当てられた時間内に完了しなかったという事実をログに記録します。他に行うことは、アプリケーションの要件によって異なります。

呼び出しtaskに関係なく、完了するまで実行し続けることに注意してください。get

于 2008-11-10T21:56:49.533 に答える
1

I think the way to look at the problem is that you need to claim the resource outside of the FutureTask, so that when you do decide to cancel it you can force the reclamation of resources.

so:

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();
 }
}

This way you can be sure that the resource will be freed. It is really frustrating that all of that cannot be encapuslated inside the future task, but I cannot find proof that calling cancel on a futuretask will ensure that a finally block is invoked inside the FutureTask. (Maybe I'll ask that as another question)

于 2009-09-16T14:10:51.080 に答える