Java ScheduledExecutorService を利用してタイマーを実装
ナビゲーションに移動
検索に移動
Java ScheduledExecutorService を利用してタイマーを実装
Java |
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<TickListener> listner;
- private ScheduledFuture<?> tickHandle;
- public Chronometer() {
- listner = new ArrayList<TickListener>();
- 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);
- }
- }
© 2006 矢木浩人