Java: Timer e filo crea
-
20-09-2019 - |
Domanda
Ho questa domanda:
Ho un timer. Con scheduleAtFixedRate crea una nuova attività Timer. In tale compito timer c'è certo codice, che può richiedere un tempo per il completamento. Come posso fare in modo che il timer non creerà nuova attività quando il precedente non ha ancora completo?
Grazie
Soluzione
La mia risposta sarebbe non utilizzare per Timer
, è obsoleto. Poiché Java5, Timer
è stato sostituito dal ScheduledExecutorService
, che è molto più flessibile e più facile da usare. È possibile ottenere un controllo più preciso su come funziona lo scheduler, il tipo di controllo non si ottiene con Timer
.
Si crea uno utilizzando il Esecutori classe di fabbrica, che ha un certo numero di metodi di fabbrica. Quello che dovrebbe essere guardando è newSingleThreadScheduledExecutor , che dovrebbe fare esattamente quello che stai cercando:
Crea un esecutore singolo thread che possono programmare comandi da eseguire dopo un certo ritardo, o di eseguire periodicamente. Compiti sono garantiti per eseguire in sequenza, e non più di un compito sarà attivo in qualsiasi tempo.
Con un ScheduledExecutorService
, invece di sottoclassi TimerTask
, si sottoclasse Runnable
direttamente, e quindi inviare il compito di esecutore. Ci sono vari metodi su l'esecutore, è necessario scegliere che uno è adatto per le vostre esigenze (leggere il javadoc per ScheduledExecutorService
con attenzione), ma il succo è qualcosa di simile:
// initialise the executor
ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
while (tasksRemaining) {
// create your task
Runnable task = ....;
// submit it to the executor, using one of the various scheduleXYZ methods
executor.schedule(task, delay, unit);
}
// when everything is finished, shutdown the executor
executor.shutdown();
Come sempre, leggere il javadoc.
Altri suggerimenti
Il doc per i href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/Timer.html"
In corrispondenza di ogni oggetto Timer viene un singolo thread in background che è utilizzato per eseguire tutti i timer del compiti, in modo sequenziale. attività timer dovrebbe completare in fretta. Se un timer compito richiede tempo eccessivo per completare, si "maiali" esecuzione dell'attività del timer filo. Questo può, a sua volta, ritardare il esecuzione di compiti successivi, può "grappolo" ed eseguire in rapida successione quando (e se) l'infrazione compito finalmente completa.
suggerisce che c'è solo una thread in background. Quindi credo che questo scenario non si verificherà.