On Wed, 29 Mar 2023 11:28:53 GMT, Aleksey Shipilev <sh...@openjdk.org> wrote:

> Java API has the `Thread.sleep(millis, nanos)` method exposed to users. The 
> documentation for that method clearly says the precision and accuracy are 
> dependent on the underlying system behavior. However, it always rounds up 
> `nanos` to 1ms when doing the actual sleep. This means users cannot do the 
> micro-second precision sleeps, even when the underlying platform allows it. 
> Sub-millisecond sleeps are useful to build interesting primitives, like the 
> rate limiters that run with >1000 RPS.
> 
> When faced with this, some users reach for more awkward APIs like 
> `java.util.concurrent.locks.LockSupport.parkNanos`. The use of that API for 
> sleeps is not in line with its intent, and while it "seems to work", it might 
> have interesting interactions with other uses of `LockSupport`. Additionally, 
> these "sleeps" are no longer visible to monitoring tools as "normal sleeps", 
> e.g. as `Thread.sleep` events. Therefore, it would be prudent to improve 
> current `Thread.sleep(millis, nanos)` for sub-millisecond granularity. 
> 
> Fortunately, the underlying code is almost ready for this, at least on POSIX 
> side. I skipped Windows paths, because its timers are still no good. Note 
> that on both Linux and MacOS timers oversleep by about 50us. I have a few 
> ideas how to improve the accuracy for them, which would be a topic for a 
> separate PR.
> 
> Additional testing:
>   - [x] New regression test
>   - [x] New benchmark
>   - [x] Linux x86_64 `tier1`
>   - [x] Linux AArch64 `tier1`

src/hotspot/share/include/jvm.h line 279:

> 277: 
> 278: JNIEXPORT void JNICALL
> 279: JVM_Sleep(JNIEnv *env, jclass threadClass, jlong millis, jint nanos);

I wonder if it would be simpler to just provide a single value, in nanoseconds, 
to the VM. That's enough for a sleep of 292 years. Windows would still need to 
convert to milliseconds of course but it overall would avoid sending two values 
down to the park code.

-------------

PR Review Comment: https://git.openjdk.org/jdk/pull/13225#discussion_r1163750704

Reply via email to