!!!Java ScheduledExecutorService を利用してタイマーを実装 [Java]{{category コード片}} !!Stopwatch.java import java.util.ArrayList; import java.util.List; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; /** * タイマーを実装 */ public class Stopwatch { public static void main(String[] args) { Stopwatch me = new Stopwatch(); me.test(); } /** * Chronometer をテストする */ public void test() { Watcher watcher = new Watcher(); Chronometer chronometer = new Chronometer(); chronometer.setOnTickListener(watcher); chronometer.setBaseTime(System.currentTimeMillis()); chronometer.start(); } /** * Chronometer のイベントを拾うためのテストクラス * */ public static class Watcher implements TickListener { public void onTick(Chronometer chronometer) { System.out.println("seconds:" + chronometer.getPastSeconds()); // 15秒カウントしたら止める if (chronometer.getPastSeconds() >= 15) { chronometer.stop(); } } } /** * タイマー */ public static class Chronometer { private ScheduledExecutorService scheduler; private long basetime; private List listner; private ScheduledFuture tickHandle; public Chronometer() { listner = new ArrayList(); scheduler = Executors.newScheduledThreadPool(1); } /** * 基準時間をセット * @param time */ public void setBaseTime(long time) { this.basetime = time; } /** * 経過秒数を取得 * @return */ public long getPastSeconds() { return (System.currentTimeMillis() - this.basetime) / 1000; } /** * リスナー登録 * @param lsnr */ public void setOnTickListener(TickListener lsnr) { listner.add(lsnr); } /** * 開始 */ public void start() { final Runnable ticker = new Runnable() { public void run() { for (TickListener tl : listner) { tl.onTick(Chronometer.this); } } }; // 1秒ごとにイベントを発生 tickHandle = scheduler.scheduleAtFixedRate(ticker, 0, 1, TimeUnit.SECONDS); } /** * 終了 */ public void stop() { scheduler.schedule(new Runnable() { public void run() { tickHandle.cancel(true); }}, 0, TimeUnit.SECONDS); } } /** * タイマーイベントリスナー */ public interface TickListener { void onTick(Chronometer chronometer); } }