2010-10-29 18 views
5

Ho provato di tutto. Questo uno troppo How to stop the task scheduled in Java.util.Timer classCome interrompere immediatamente l'attività pianificata nella classe Java.util.Timer

Ho un compito che implementa java.util.TimerTask

chiamo questo compito in 2 modi:

  1. mi Timer programmatore in questo modo:

    timer. pianificazione (timerTask, 60 * 1000);

  2. a volte ho bisogno di quel lavoro per iniziare immediatamente e deve annullare TimerTask se c'è qualche che sta lavorando

    cancelCurrentWork(); timer.schedule (timerTask, 0);

Questa implementazione non si ferma il lavoro in corso: (documentazione dice: Se l'attività è in esecuzione quando si verifica questa chiamata, l'attività verrà eseguita fino al completamento, ma non potrà mai funzionare ancora)

Ma io bisogno di fermarsi.

public static void cancelCurrentwork() { 
if (timerTask!= null) { 
    timerTask.cancel(); 
} 
} 

Questa implementazione annulla semplicemente il timer ma lascia attualmente il compito da completare.

public static void cancelCurrentwork() { 
if (timer!= null) { 
    timer.cancel(); 
} 
} 

C'è un modo timer STOP taks esecuzione attuale, qualcosa come Thread.kill() o qualcosa del genere? Quando ho bisogno che quell'attività si interrompa, voglio che perda tutti i suoi dati.

risposta

5

Non c'è modo per il timer di interrompere l'attività nelle sue tracce.

È necessario disporre di un meccanismo separato nell'attività in esecuzione, che verifica se deve continuare a essere in esecuzione. Ad esempio, potresti avere una variabile AtomicBoolean keepRunning che hai impostato su false quando vuoi che l'attività termini.

+0

E come interrompere il lavoro dall'interno dell'attività? Potrei controllare con booleano, ma quale metodo dovrei chiamare allora? this.cancel()? – vale4674

+1

E altra domanda: qualche API come ScheduledExecutorService o qualcosa del genere ti permette di ARRESTARE l'attività? – vale4674

+0

No, si ritorna semplicemente dal metodo 'run'. – aioobe

0

Se il timer utilizza una specie di file/socket ecc., È possibile chiudere l'oggetto dall'esterno del timer e l'attività del timer genererà un'eccezione e sarà possibile utilizzarla per arrestare il timer.

ma in generale è necessario un qualche tipo di pillola veleno per interrompere con successo un thread/timer separato.

+0

sì, ma questa è la cosa. Non c'è modo di fermarlo immediatamente e davvero non capisco come sia possibile. – vale4674

+0

comunque ho usato quel suggerimento da aioobe, e controllo costantemente la mia bandiera e poi ritorna dal metodo "run". – vale4674

Problemi correlati