Empujo mis futuros desde un ExecutorService a un mapa hash. Más tarde, puedo llamar cancelar en futuros desde dentro del mapa hash. Aunque el resultado es cierto, más tarde toco puntos de interrupción dentro del procedimiento de llamada, como si la cancelación futura() no tuviera ningún efecto. . Creo que podría ser un caso de dos referencias diferentes aquí (a pesar de que los ID de referencia se enumeran como el mismo cuando breakpointing), pero preguntaba si algunos expertos podrían meter su cuchara Esto es lo que se ve el código como:Tarea futura de ExecutorService que no cancela realmente
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);
que permiten que continúe el procesamiento (que es un bucle que presenta las tareas a medida que se pasan en), y más tarde puede intentar cancelar de una fuente externa llamando a 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;
}
Pero todavía encontrarse con un "no -cancelled "ruta dentro de MyProcessor.call() después de llamar a future.cancel(), es decir, no se está cancelando en realidad.
¿Dónde me estoy equivocando con esto? ¿Hay algo mejor para hacer esto?
También relacionado con: http://stackoverflow.com/questions/6698977/thread-interrupt-will-it-cancel-oncoming-wait-call – Gray
Veo, eso tiene sentido - No estoy esperando () estado en este punto en la llamada invocable, por lo que no está arrojando la excepción InterruptedException para mí. Desafortunadamente, lo que intento cancelar es una sola invocación de estado a una base de datos una vez que ya ha comenzado, por lo que en el mejor de los casos puedo probar si el hilo se interrumpe después. –
Para aclarar, esta es la afirmación en la que probablemente me encuentre cuando solicite la cancelación, un PreparedStatement en la base de datos: 'stmt.execute();' Así que supongo que tengo que dejar que la base de datos termine el curso, y luego verifique la interrupción. –