Tarefa futura do ExecutorService não cancelando verdadeiramente

Eu empurro meus futuros de um ExecutorService em um mapa de hash. Mais tarde, posso cancelar o cancelamento no Futures a partir do mapa hash. Embora o resultado seja verdadeiro, mais tarde eu acertei pontos de interrupção dentro do procedimento de Callable, como se o Cancel () do Future não tivesse efeito. Eu acho que pode ser um caso de duas referências diferentes aqui (mesmo que os IDs de referência sejam listados como os mesmos quando breakpoint), mas estava imaginando se alguns especialistas poderiam entrar em contato. Veja como o código se parece:

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);

Eu permito que o processamento continue (é um loop que submete tarefas conforme elas são passadas), e mais tarde eu posso tentar cancelar de uma fonte externa chamando este método:

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;     
}

Mas eu ainda encontro um caminho "não cancelado" dentro de MyProcessor.call () depois que future.cancel () é chamado - ou seja, ele não está realmente sendo cancelado.

Onde estou indo errado com isso? Existe um melhor para fazer isso?

questionAnswers(2)

yourAnswerToTheQuestion