Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What's the purpose of sleep(long millis, int nanos)?

Tags:

java

sleep

In the JDK, it's implemented as:

public static void sleep(long millis, int nanos) 
throws InterruptedException {
if (millis < 0) {
        throw new IllegalArgumentException("timeout value is negative");
}

if (nanos < 0 || nanos > 999999) {
        throw new IllegalArgumentException(
            "nanosecond timeout value out of range");
}

if (nanos >= 500000 || (nanos != 0 && millis == 0)) {
    millis++;
}

sleep(millis);
}

which means the nanos argument doesn't do anything at all.

Is the idea behind it that on hardware with more accurate timing, the JVM for it can provide a better implementation for it?

like image 676
Reverend Gonzo Avatar asked Sep 07 '25 17:09

Reverend Gonzo


2 Answers

A regular OS doesn't have a fine grained enough resolution to sleep for nanoseconds at a time. However, real time operating systems exist, where scheduling an event to take place at an exact moment in time is critical and latencies for many operations are VERY low. An ABS system is one example of a RTOS. Sleeping for nanoseconds is much more useful on such systems than on normal OSes where the OS can't reliably sleep for any period less than 15ms.

However, having two separate JDKs is no solution. Hence on Windows and Linux the JVM will make a best attempt to sleep for x nanoseconds.

like image 149
Dunes Avatar answered Sep 10 '25 05:09

Dunes


It looks like a future-proof addition, for when we all have petaflop laptops and we routinely specify delays in nanoseconds. Meanwhile if you specify a nanosecond delay, you get a millisecond delay.

When hardware improves and the JVM follows, the app will not need to be rewritten.

like image 45
jcomeau_ictx Avatar answered Sep 10 '25 06:09

jcomeau_ictx



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!