これはマルチスレッド Java アプリケーションの一般的なシナリオだと思うので、ここで説明します。
私の Java アプリには、 5 つのスレッドのプールを定義するthreadExecutorオブジェクトがあります。
ExecutorService threadExecutor = Executors.newFixedThreadPool(5);
sendCallablesメソッドは、ジョブのリストを Executor に割り当てる責任があります。ObjectXを使用してListを
追跡します。このようにして、ユーザーがスレッドを中断/キャンセルしたい場合に、Future のリストを参照することができます。このようなもの:
Map<ObjectX, List<Future<String>>> map = new HashMap<ObjectX, Future<String>>();
public void sendCallables(ObjectX referenceObj, List<Callable<String>> list) {
...
List<Future<String>> futureList = new ArrayList<Future<String>>();
for(Callable<String> myCallableJob : list) {
Future<String> future = threadExecutor.submit(myCallableJob);
futureList.add(future);
}
...
map.add(referenceObj, futureList);
...
}
public void cancelFutures(ObjectX referenceObj) {
...
List<Future<String>> list = map.get(referenceObj);
for(Future<String> future : list) {
future.cancel();
}
map.remove(referenceObj);
....
}
ここまでは順調ですね。
提出されたタスクを実行する必要がなくなった場合があります。
このような状況では、タスクをキャンセルする決定は、アプリケーションによってインテリジェントに/自動的に行われる必要があります。
このようなケースの例は、ユーザーのセッションが期限切れになったとき、またはすべてのジョブが実行される前に特定のフロー (送信されたタスクに関連する) が終了したときの Web アプリケーションで見つけることができます。
したがって、基本的に、アプリケーションがジョブを実行し続ける意味がない場合は、毎回 cancelFutures(referenceObj) を呼び出す必要があります。アプリケーションがそれを呼び出す必要がある場合は、それぞれの状況を特定する必要があります。
これを行うためのより良いアプローチがあるかどうか疑問に思っています。
アプリケーションによって referenceObj が参照されなくなったら、 WeakHashMapでマップをクリーンアップできるように考えていましたが、まだ .cancel() を呼び出す必要があるため、Future の実行を停止しません (一種のWeakHashMap remove(Object) メソッドに関連付けられた eventHandler ? )