Javaマルチスレッドアプリ - 先物オブジェクトを動的にキャンセルする方法
-
22-09-2019 - |
質問
これはマルチスレッドJavaアプリケーションの一般的なシナリオだと思いますので、ここで説明してみます。
私のJavaアプリで私はです threadexecutor 5つのスレッドのプールを定義するオブジェクト。
ExecutorService threadExecutor = Executors.newFixedThreadPool(5);
a SendCallables メソッドは、ジョブのリストを執行者に割り当てる責任があります。
私はaを追跡します リスト で ObjectX. 。このようにして、ユーザーがスレッドを中断/キャンセルする場合、先物のリストを参照できます。このようなもの:
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);
....
}
ここまでは順調ですね。
現在、NOがある場合があります 提出されたタスクをもう実行する必要があります.
これらの状況では、タスクをキャンセルする決定は、アプリケーションによってインテリジェント/自動的に取得される必要があります。
このようなケースの例は、ユーザーのセッションが期限切れになったとき、またはすべてのジョブが実行される前に特定のフロー(提出されたタスクに関連する)が終了するときにWebアプリケーションに記載されています。
したがって、基本的には、アプリケーションがジョブを実行し続けるための感覚がないときに、CancelFutures(ReferenceOBJ)に電話する必要があります。アプリケーションがそれを呼び出す必要がある場合、各状況を特定する必要があります。
これを行うためのより良いアプローチがあるのだろうかと思っています。
私はaで考えていました WeakHashmap ReferenceOBJがアプリケーションで参照されなくなったらマップをクリーンアップできるようにするために、これは未来を止めて実行されません。オブジェクト)メソッド?)
他のヒント
私があなたの問題を正しく理解していれば、あなたはさまざまな種類の活動が起こっており、それらがキャンセルできるという理由だけでこれらのアクティビティを結び付けたくありません。
私にとって、キャンセルが必要な各ケースはイベントをトリガーするはずです。イベントリスナーはこれらのイベントを聴き、関連性をキャンセルします Future
.
セッションに関するあなたの例 - あなたは実装するクラスを持っているでしょう javax.servlet.http.HttpSessionListner
, 、キャンセルが必要な関連するタスクを検出し、それらのタスクをキャンセルするためにイベントを起動します。すべてが非同期であるため、キャンセルされたタスクが終了したかどうかは気にしません。