2010-11-29 70 views
15

Me pregunto cuál es la forma más precisa de convertir un gran valor de nanosegundos en milisegundos y nanosegundos, con un límite superior en los nanosegundos de 999999. El objetivo es combinar los valores de nanosegundos y milisegundos para garantizar la máxima resolución posible con el límite otorgado. Esto es para la comparabilidad con los métodos sleep/wait y alguna otra biblioteca externa que proporciona grandes valores de nanosegundos.Conversión de nanosegundos a milisegundos y nanosegundos <999999 en Java

Editar: mi código tiene el siguiente ahora:

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

vale la pena señalar que esta vez es una pista para que el sistema operativo espere al menos este tiempo. En Windows y Linux, la demora suele ser de 2 ms, pero puede ser mucho más larga. En mi humilde opinión, no debe preocuparse por el tiempo de los nano segundos ya que es muy poco probable que vea alguna diferencia. –

Respuesta

19

acaba de tomar el DIVMOD de ella con 1000000.

+0

Eso parece lógico :) –

+0

¿Podría verificar que el código pegado sea correcto? Saludos: D Una cosa de la que estoy cansado es el límite superior de 999999 en vez de 1000000 (por lo que dice el Javadoc). ¿Podría eso causar algún problema? –

+2

Las matemáticas son correctas. El cheque no es estrictamente necesario y huele a número mágico. –

68

Por qué no utilizar el construido en los métodos de Java . El TimeUnit es parte del paquete concurrente por lo construida exactamente para sus necesidades

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

Este método truncar a 0 si, por ejemplo, se usaron 999999 nanosegundos – Gilian

+0

Esto no funciona y tampoco responde la pregunta. La cuestión era convertir a millis Y nanos, lo que necesita, por ejemplo, para la llamada Thread.sleep (millis, nanos). –

50

Para una conversión cada vez más cortos usando java.util.concurrent.TimeUnit, equivalente a lo que Shawn escribió más arriba, se puede utilizar:

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