In fact, Java relies on OS facilities to implement its timers1. The real reason that you don't get better than 1 millisecond accuracy on timers is that this is the limit of what a typical (non-realtime) OS provides. And even if the time resolution was finer, the OS still could not guarantee to "wake up" the user process at precisely the time that the application asked for.
If you need real (i.e. hard) realtime behaviour, including high precision timers and clocks, you need a realtime OS, and you need to run a Realtime Java on it.
1 - These are the same OS facilities that the C and C++ libraries use. So simply switching to C or C++ won't help much.