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

MyMemoWiki

「Java ScheduledExecutorService を利用してタイマーを実装」の版間の差分

提供: MyMemoWiki
ナビゲーションに移動 検索に移動
(ページの作成:「==Java ScheduledExecutorService を利用してタイマーを実装== [Java]{{category コード片}} ===Stopwatch.java=== import java.util.ArrayList; import java.…」)
 
1行目: 1行目:
 
==Java ScheduledExecutorService を利用してタイマーを実装==
 
==Java ScheduledExecutorService を利用してタイマーを実装==
[Java]{{category コード片}}
+
[[Java]]{{category コード片}}
 
===Stopwatch.java===
 
===Stopwatch.java===
 
  import java.util.ArrayList;
 
  import java.util.ArrayList;
39行目: 39行目:
 
              
 
              
 
             // 15秒カウントしたら止める
 
             // 15秒カウントしたら止める
             if (chronometer.getPastSeconds() >= 15) {
+
             if (chronometer.getPastSeconds() >= 15) {
 
                 chronometer.stop();
 
                 chronometer.stop();
 
             }
 
             }
51行目: 51行目:
 
         private ScheduledExecutorService scheduler;
 
         private ScheduledExecutorService scheduler;
 
         private long basetime;
 
         private long basetime;
         private List<TickListener> listner;
+
         private List&lt;TickListener&gt; listner;
         private ScheduledFuture<?> tickHandle;
+
         private ScheduledFuture&lt;?&gt; tickHandle;
 
      
 
      
 
         public Chronometer() {
 
         public Chronometer() {
             listner = new ArrayList<TickListener>();
+
             listner = new ArrayList&lt;TickListener&gt;();
 
             scheduler = Executors.newScheduledThreadPool(1);
 
             scheduler = Executors.newScheduledThreadPool(1);
 
         }
 
         }

2020年2月15日 (土) 08:03時点における版

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