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

È stato utile?

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à.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top