2017-06-09 2 views
1

Je veux planifier la tâche chaque millisecondes de temps, et je sais à propos de Timers, Executors et ainsi de suite. J'ai trouvé que cette méthode est la plus précise. Mais je veux juste savoir si mon chemin peut être trop lourd pour un (grand) programme?Utiliser le thread Java comme un sheduler de tâches,

new Thread(() -> { 
     long time = System.currentTimeMillis(); 
     while (true) { 
      if (System.currentTimeMillis() - time >= 1000) { 
       // Scheduled task 
       System.out.println(new SimpleDateFormat("HH:mm:ss:SSS").format(new Date(System.currentTimeMillis()))); 
       time = System.currentTimeMillis(); 
      } 
     } 
    }).start(); 
+1

Je ne suis pas clair sur ce que vous demandez. – Todd

+0

Je pense que la boucle peut être fortement chargée et je veux utiliser un tel programmateur souvent dans le programme. –

+2

Vous optimisez des éléments qui n'ont pas besoin d'être optimisés. Utilisez la classe Timer, c'est 100x plus facile à comprendre. – Todd

Répondre

0

Votre méthode crée un nouveau thread pour chaque tâche répétitive. Chaque thread nécessite l'allocation d'une pile entière. En conséquence, la consommation de mémoire de votre méthode est beaucoup plus grande qu'elle ne devrait l'être. Cela pourrait devenir un problème si vous créez assez de ces threads de minuterie.

Il vaudrait mieux utiliser java.util.Timer et TimerTasks si vous avez un grand nombre de ces tâches. Incidemment, comme écrit, votre timing de tâche dérivera, car il y aura occasionnellement une milliseconde supplémentaire ou plus entre le déclenchement de la tâche et la réinitialisation de la variable time. Cela peut être corrigé dans votre code, cependant.

0

Votre code a plusieurs numéros.

1.Votre code est en cours d'exécution mais il doit attendre le moment donné s'il n'est pas prêt.Vous pouvez utiliser la queue de retard ou d'autres api simultanées disponibles si l'élément n'est pas prêt il peut attendre ou dormir et quand l'élément est prêt il notifiera le thread de travail.

2.Il est un seul thread s'il casse ou une tâche prend beaucoup de temps puis il va échapper à la prochaine planification.Et il n'est pas logiquement prévu toutes les 30 secondes pour un exemple.Il compte après l'achèvement de l'exécution d'où il est calculateur.