Si potrebbe anche tentare con un approccio del genere:
codice:
public static void myNanosDelay(long nanoseconds) throws InterruptedException {
if (nanoseconds > 5000000) {
TimeUnit.NANOSECONDS.sleep(nanoseconds);
} else {
long start = System.nanoTime();
long diff;
do {
diff = System.nanoTime() - start;
} while (diff < nanoseconds);
}
}
Se il delay è maggiore di 5ms si delega alla sleep della TimeUnit (che si basa sulla sleep di Thread che fa "quello che può"), altrimenti si fa il ciclo "fine" (che ovviamente occupa CPU) per delay più piccoli.
Non è il massimo ma l'ho scritto e provato e ... sembra "ragionevole" anche con tempi piccoli (dell'ordine dei microsecondi).