According to the javadoc, System.nanoTime() should only be used to measure elapsed time, but not compute a target time in the future, as nanoTime() might return a a time in the future.
Code like the one below might fail:
When computing target_time, System.nanoTime() could return a negative value (numeric overflow) or a value in the future. In the first case, target_time could be negative, so the method would not block at all. In the latter case, target_time could be huge, so the method would block for a long time.
Investigate all occurrences where we use nanoTime() to compute a time in the future, and see what impact a future value value could have. Possibly replace with System.currentTimeMillis() or the time service.