Futures を ExecutorService からハッシュ マップにプッシュします。後で、ハッシュ マップ内から Future の cancel を呼び出すことができます。結果は true ですが、Future cancel() が何の効果もなかったかのように、後で Callable プロシージャ内のブレークポイントにヒットしました。ここでは 2 つの異なる参照の場合であると思います (参照 ID はブレークポイント時に同じとしてリストされますが)、一部の専門家が参加できるかどうか疑問に思っていました。コードは次のようになります。
ExecutorService taskExecutor = Executors.newCachedThreadPool();
Map <String, Future<Object>> results = new HashMap <String, Future<Object>>();
Future<Object> future = taskExecutor.submit(new MyProcessor(uid));
results.put(uid, future);
処理を続行できるようにし (タスクが渡されたときにタスクをサブミットするループです)、後で次のメソッドを呼び出して外部ソースからキャンセルを試みる場合があります。
public static synchronized boolean cancelThread(String uid) {
Future<Object> future = results.get(uid);
boolean success = false;
if (future != null) {
success = (future.isDone() ? true : future.cancel(true));
if (success)
results.remove(uid);
}
return success;
}
しかし、future.cancel() が呼び出された後でも、MyProcessor.call() 内で「キャンセルされていない」パスに遭遇します。つまり、実際にはキャンセルされていません。
これのどこが間違っているのですか?これを行うより良い方法はありますか?