Spingo i miei Futures da un ExecutorService in una mappa hash. Più tardi, potrei chiamare cancel su Futures dall'interno della mappa hash. Sebbene il risultato sia vero, in seguito ho raggiunto i punti di interruzione all'interno della procedura Callable, come se l'annullamento futuro() non avesse avuto alcun effetto. . Penso che potrebbe essere un caso di due diversi riferimenti qui (anche se gli ID di riferimento sono elencati come lo stesso quando breakpointing), ma chiedevo se alcuni esperti potrebbero carillon Ecco quello che il codice è simile:Attività futura di ExecutorService che non si annulla 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);
Acconsento il trattamento per continuare (si tratta di un ciclo che invia compiti sono passati a), e più tardi mi può tentare di cancellare da una fonte esterna chiamando questo metodo:
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;
}
Ma ho ancora incontrare un "non -cancelled "percorso all'interno di MyProcessor.call() dopo che è stato chiamato future.cancel(), cioè non viene effettivamente cancellato.
Dove sto andando male con questo? C'è di meglio è stato per fare questo?
Relativo anche a: http://stackoverflow.com/questions/6698977/thread-interrupt-will-it-cancel-oncoming-wait-call – Gray
Vedo che ha senso - Non sono in attesa () stato a questo punto in Callable, quindi non sta lanciando InterruptedException per me. Sfortunatamente, quello che sto cercando di cancellare è una singola chiamata a un database una volta che è già stata avviata, quindi nella migliore delle ipotesi posso mettere un test per se il thread è interrotto in seguito. –
Per chiarire, questa è l'affermazione in cui mi trovo probabilmente quando viene richiesto l'annullamento, una PreparedStatement nel database: 'stmt.execute();' Quindi suppongo di dover lasciare che il database finisca il corso e controllare l'interruzione in seguito. –