Java - alternative à thread.sleep
J'ai une obligation de mettre en pause une boucle while pour un nombre de millisecondes. J'ai essayé d'utiliser Thread.le sommeil(la durée), mais elle n'est pas exacte, surtout dans une boucle scénario. Une précision à la milliseconde est important dans mon programme.
Voici l'algorithme où je ne veux pas revenir en arrière pour vérifier l'état jusqu'à ce que expectedElapsedTime
a passé par.
while (condition) {
time = System.currentTimeMillis();
//do something
if (elapsedTime(time) < expectedElapsedTime) ) {
pause the loop //NEED SUBSTITUTE FOR Thread.sleep()
}
//Alternative that I have tried but not giving good results is
while ((elapsedTime(time) < expectedElapsedTime)) {
//do nothing
}
}
long elapsedTime(long time) {
long diff = System.currentTimeMillis() - time;
return diff;
}
source d'informationauteur user1189747
Vous devez vous connecter pour publier un commentaire.
Essayer un ScheduledThreadPoolExecutor. Il est censé donner plus fiable calendrier résultats.
Qu'attendez-vous?
Si vous allez à dormir ensuite, une fois que votre processus est à nouveau runable il faudra attendre le thread planificateur de le programmer à nouveau.
Je veux dire si vous allez à dormir pendant 50 secondes, cela ne signifie pas que votre processus sera exécuté exactement de 50 secondes.Parce que plus tard il se réveille et est exécutable, il devra attendre d'être programmé pour le CPU qui prend du temps, plus le temps que vous avez pour le changement de contexte.
Il n'y a rien que vous pouvez faire pour contrôler de sorte que vous pouvez ne pas avoir la précision que vous dites.
Pour votre cas, je voudrais suggérer tourne en boucle à la place.
Java n'est pas un système temps-réel, vous ne pouvez pas faire un thread s'en aller et de revenir sur un calendrier serré. Pour planifier l'exécution du programme vers le bas à la milliseconde vous avez besoin d'utiliser une plate-forme différente - comme simpleRTJ ou Java extension Temps Réel.
Le retard est de nature à choisi de façon arbitraire, et je voudrais donc la question de la nécessité de votre temps réel de l'intervalle de synchronisation.
Si vous avez besoin d'un temps de lecture, vous devez occupés à attendre pour le temps d'atteinte. Donner le CPU signifie que vous ne pouvez pas garantir que vous aurez en arrière quand vous le souhaitez.
Vous pourriez mettre en œuvre wait/notify mécanisme et de déléguer à un autre thread la responsabilité d'aviser l'autre thread en attente que le temps est passé et qu'il puisse aller de l'avant ...
Par exemple lorsque le threadA besoin d'attendre un certain laps de temps, vous pouvez mettre le thread en état d'attente et de démarrer une minuterie tâche qu'après un certain laps de temps (intervalle ) appel d'informer et se réveiller le ThreadA que aller de l'avant, cela pourrait être une alternative .
Si vous voulez être précis avec les sons que vous utilisez un séquenceur et de régler le tempo en BPM:
séquenceur.setTempoInBPM(120);
N'oubliez pas de garbage collector pauses. Il peut battre tous les plans de votre
La solution est d'utiliser un gestionnaire avec un exécutable et l'utilisation de la méthode 'postDelayed'. Exemple:
https://stackoverflow.com/a/21680858