| ページ一覧 | ブログ | twitter |  書式 | 書式(表) |

MyMemoWiki

Java ScheduledExecutorService を利用してタイマーを実装

提供: MyMemoWiki
ナビゲーションに移動 検索に移動

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);
    }
}