私はExecutorServiceからMy Futuresをハッシュマップにプッシュします。後で、私はハッシュマップ内から先物についてキャンセルを呼び出すことがあります。結果はtrueですが、私は後でcancel()が効果を持たないかのように、Callableプロシージャ内でブレークポイントを後で押しました。私は(ブレークポイント時に参照IDが同じとして列挙されているにもかかわらず)を、それはここでは2つの異なる参照の場合であるかもしれないと思うが、一部の専門家は、チャイムができればと思いまして。ここのコードは次のようになります。ExecutorServiceの今後のタスクが本当にキャンセルされない
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()内の "キャンセルされた"パスが呼び出されます。つまり、実際にキャンセルされていません。
どこが違うのですか?これを行う方がいいですか?
また、関連している:http://stackoverflow.com/questions/6698977/thread-interrupt-will-it-cancel-oncoming-wait-call – Gray
私はそれが意味を理解する - 私は待っていない)ステータスを呼び出すことができるので、私のためにInterruptedExceptionを投げているわけではありません。残念ながら、私が取り消そうとしているのは、すでに開始されているデータベースに対する単一のステートメント呼び出しです。したがって、スレッドが後で中断されたかどうかのテストを行うことができます。 –
これを明確にするために、キャンセルが要求されたときのステートメントをPreparedStatementというデータベースに入れます: 'stmt.execute();' 私は、データベースをコース終了し、後で割り込みをチェックする必要があると思います。 –