2010-12-20 1 views
2

J'ai besoin d'un moyen de mettre en pause/mettre en veille un thread d'une manière indépendante de l'horloge système. Ce qui veut dire que si je veux affaiblir un thread en dT msec, il doit le faire aussi si l'heure du système change de manière significative pendant ce temps. Je ne suis pas tellement intéressé par la précision des msecs et plus en principe que cela fonctionnera. Les TimerTasks ne sont pas une option puisqu'ils fonctionnent en temps absolu.Horloge système Java Programmation indépendante/mise en pause

Répondre

0

Je ne sais pas si j'ai bien compris votre question. Si vous avez besoin d'un planificateur de tâches, Quartz est plutôt bon. Si vous voulez réellement mettre en pause un thread arbitraire pendant x fois, cela peut être un peu plus compliqué.

1

Tricky .... il est difficile de savoir si l'horloge système est même utilisé pour toute stratégie donnée. Cependant, vous évitez l'horloge parce que l'heure peut être modifiée pendant la pause du thread, mais System.nanoTime() est indépendant de l'heure actuelle car il est purement le nombre de nanosecondes depuis le démarrage de la JVM. Par conséquent, si la stratégie de pause utilise des nanos, on peut supposer que les périodes de pause conserveront leur précision grâce aux changements d'heure de l'horloge du système. Peut-être Thread.join (0, nanos) appelé dans une boucle:

public static void pause(long ms) throws InterruptedException { 
    long final ZERO = 0L; 
    int final MAX_NANOS = 999999; 
    for(int i = 0; i < ms+1; i++) { 
     Thread.currentThread().join(ZERO, MAX_NANOS); 
    } 
} 

Je n'ai pas testé avec des changements d'horloge du système, mais il semble fonctionner dans un écart 0,004% de.