2010-11-29 20 views
15

Je me demande quelle est la façon la plus précise de convertir une valeur de grandes nanosecondes en millisecondes et nanosecondes, avec une limite supérieure sur les nanosecondes de 999999. L'objectif est de combiner les valeurs des nanosecondes et millisecondes pour assurer la résolution maximale possible avec la limite donnée. C'est pour la comparabilité avec les méthodes sleep/wait et une autre bibliothèque externe qui donne de grandes valeurs de nanosecondes.Conversion de nanosecondes en millisecondes et nanosecondes <999999 en Java

Edit: mon code ressemble à ceci maintenant:

while (hasNS3Events()) {         
    long delayNS = getNS3EventTSDelay(); 
    long delayMS = 0; 
    if (delayNS <= 0) runOneNS3Event(); 
    else { 
     try { 
      if (delayNS > 999999) { 
       delayMS = delayNS/1000000; 
       delayNS = delayNS % 1000000; 
      } 

      EVTLOCK.wait(delayMS, (int)delayNS); 
     } catch (InterruptedException e) { 

     } 
    } 
} 

Cheers, Chris

+1

il convient de noter que cette fois est un indice pour l'OS d'attendre au moins aussi longtemps. Sous Windows et Linux, le délai est généralement inférieur à 2 ms, mais il peut être très long. IMHO Vous ne devriez pas vous inquiéter de la synchronisation de la nano-seconde, car il est très peu probable que vous voyiez une différence. –

Répondre

19

Il suffit de prendre la divmod de celui-ci avec 1000000.

+0

Cela semble logique :) –

+0

Pourriez-vous vérifier que le code collé est correct? Cheers: D Une chose que je suis fatigué est la limite supérieure de 999999 au lieu de 1000000 (donc le Javadoc dit). Cela pourrait-il causer un problème? –

+2

Les maths sont correctes. La vérification n'est pas strictement nécessaire et ça sent le nombre magique. –

68

Pourquoi ne pas utiliser les méthodes intégrées Java . Le TimeUnit fait partie du paquet concurrent donc construit exactement pour vos besoins

long durationInMs = TimeUnit.MILLISECONDS.convert(delayNS, TimeUnit.NANOSECONDS); 
+4

Cette méthode est tronquée à 0 si, par exemple, 999999 nanosecondes ont été utilisées – Gilian

+0

Cela ne fonctionne pas et ne répond pas à la question. La question était de convertir en millis ET nanos, dont vous avez besoin par exemple pour l'appel Thread.sleep (millis, nanos). –

50

Pour une conversion toujours plus court en utilisant java.util.concurrent.TimeUnit, ce qui équivaut à ce que Shawn a écrit ci-dessus, vous pouvez utiliser:

long durationInMs = TimeUnit.NANOSECONDS.toMillis(delayNS);