10

簡単に言えば、私はFutureオブジェクトのコレクションを持っています。すでに進行中のものもあれば、まだ進行中のものもあります。future.cancel(false)ドキュメントによると、コレクションと呼び出しを繰り返します。これにより、Future現在実行されていないすべての s をキャンセルする必要がありますが、他のすべての s を完了することができます。

Future私の質問は次のとおりです。電話をかけた後、特定の処理が完了したことをどのように知ることができfuture.cancel(false)ますか? その前に実際に呼び出されたため、future.isDone()常に戻り、がまだ実行中であっても常に a をスローします。truecancel()future.get()CancellationExceptionFuture

助言がありますか?

4

3 に答える 3

1

実際の Future の状態を反映する Future 実装にフラグを追加できます

于 2014-09-17T13:08:11.193 に答える
1

与えられたCallable<Object> c

futureTask1 = new FutureTask<Object>(c);
futureTask2 = new FutureTask<Void>(futureTask1, null);

executor.execute(futureTask2);

結果が必要な場合:

futureTask1.get()

結果に興味がなくなった場合:

futureTask1.cancel(mayInterruptIfRunning)

callable 内のコードが実行されていない (実行されない) ことを確認するために待機したい場合 (呼び出されていないか、キャンセルが完了しているか、結果の生成が完了しているかに関係なく):

futureTask2.get()

動作を開始する前にキャンセルされた場合でも、エグゼキューターがスケジュールされたタスクを実行するのを待機します (既にキャンセルされている場合は実行されません)。YMMV

于 2016-01-08T10:13:53.700 に答える
1

Future保留中の計算の将来の結果をモデル化し、その結果はキャンセルされた未来から来るものではないため、結果が破棄された計算がいつ完了するかを知る方法がないのは当然ですFuture。つまり、そのアプローチで目標を達成するには、別のパラダイムが必要になります。

送信されたすべてのタスクが完了するのを待ちたい場合、Executor Service API で直接サポートされている最も近い方法は、Executor サービス全体をシャットダウンし、その終了を待つことです。

上記があなたのソリューションに合わない場合、カスタムソリューションよりも優れたアプローチはありませんRunnable.

于 2014-09-17T13:14:44.820 に答える