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()を使うと便利である。