Java5からナノ秒のsleepとかもサポートされている。Thread.sleep()でもできるが、TimeUnitというenumクラスもあるので、そちらを使ってみる。
次の例は1秒の休止を指定精度を変更してTimeUnitで実装している。休止時間の計測にはSystem.currentTimeMillis()とSystem.nanoTime()を使っている。
package org.sssg.soft.sample.timer;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
public class SimpleSleep {
public void getTimeMillis(Runnable r) {
long start = System.currentTimeMillis();
r.run();
long end = System.currentTimeMillis();
System.out.println("TimeMillis Sleep " + (end - start) + " ms");
}
public void getNanoTime(Runnable r) {
long start = System.nanoTime();
r.run();
long end = System.nanoTime();
System.out.println("NanoTime Sleep " + (end - start) + " ns");
}
public static void main(String[] args) {
List<Runnable> list = new ArrayList<Runnable>();
list.add(new Runnable() {
@Override
public void run() {
System.out.println("TimeUnit.SECONDS -------------------- ");
try {
TimeUnit.SECONDS.sleep(1L);
} catch (InterruptedException ex) {
}
}
});
list.add(new Runnable() {
@Override
public void run() {
try {
System.out.println("TimeUnit.MILLISECONDS ----------- ");
TimeUnit.MILLISECONDS.sleep(1000L);
} catch (InterruptedException ex) {
}
}
});
list.add(new Runnable() {
@Override
public void run() {
try {
System.out.println("TimeUnit.MICROSECONDS ----------- ");
TimeUnit.MICROSECONDS.sleep(1000000L);
} catch (InterruptedException ex) {
}
}
});
list.add(new Runnable() {
@Override
public void run() {
try {
System.out.println("TimeUnit.NANOSECONDS ------------ ");
TimeUnit.NANOSECONDS.sleep(1000000000L);
} catch (InterruptedException ex) {
}
}
});
SimpleSleep app = new SimpleSleep();
for (Runnable r : list) {
app.getTimeMillis(r);
app.getNanoTime(r);
}
}
}
ちなみに、Object.wait()でミリ秒やナノ秒を指定するときには、TimeUnit.timedWait()を使うと便利である。