トップ 一覧 ping 検索 ヘルプ RSS ログイン

Java ScheduledExecutorService を利用してタイマーを実装の変更点

  • 追加された行はこのように表示されます。
  • 削除された行はこのように表示されます。
!!!Java ScheduledExecutorService を利用してタイマーを実装
[Java]
[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<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);
     }
 }