Domanda

Perché io sono l'esecuzione di un compito critico volta ogni secondo, ho confrontato diversi metodi per trovare il modo migliore per garantire che il mio compito sia realmente eseguita in intervalli di tempo fissi. Dopo aver calcolato la derivazione standard dell'errore per tutti i metodi sembra che con il metodo porta a scheduledExecutorService.scheduleAtFixedRate() i migliori risultati, ma non ho la più pallida idea perché è così.

Qualcuno sa come funziona internamente quel metodo? Come lo fa per esempio in confronto ad una semplice sleep() assicurarsi che il compito si fa riferimento è in realtà eseguita in intervalli di tempo fissi?

È stato utile?

Soluzione

Una 'normale' Java VM non può assumersi alcuna responsabilità hard real-time sui tempi di esecuzione (e di conseguenza di che anche sui tempi di programmazione). Se si ha realmente bisogno in tempo reale duro garantisce si dovrebbe avere uno sguardo a un tempo reale VM come Java RTS . Naturalmente è necessario un vero e proprio sistema operativo tempo in quel caso anche.

Per quanto riguarda il confronto a Thread.sleep (): il vantaggio di scheduledExecutorService.scheduleAtFixedRate () rispetto a un (ingenua) utilizzo di Thread.sleep () è che non è influenzato dal tempo di esecuzione dell'operazione pianificata. Vedere ScheduledFutureTask.runPeriodic () su come questo viene implementato.

Altri suggerimenti

Si può avere uno sguardo di realizzazione OpenJDK7 di ScheduledThreadPoolExecutor.java che è l'unica classe che implementa l'interfaccia ScheduledExecutorService.

Tuttavia, per quanto ne so non c'è garanzia nel ScheduledExecutorService sulla precisione. Quindi, anche se i tuoi measurments mostrano questo per essere acurate che potrebbe non essere il caso se si passa a una piattaforma diversa, vm o JDK.

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