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` This pull request has now been integrated. Changeset: fcb280a4 Author: Aleksey Shipilev <sh...@openjdk.org> URL: https://git.openjdk.org/jdk/commit/fcb280a48bf9f562e6c0982c1d7a0076ee2e736e Stats: 254 lines in 11 files changed: 226 ins; 9 del; 19 mod 8305092: Improve Thread.sleep(millis, nanos) for sub-millisecond granularity Reviewed-by: dholmes, alanb ------------- PR: https://git.openjdk.org/jdk/pull/13225