[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);
}
}
YAGI Hiroto (piroto@a-net.email.ne.jp)
twitter http://twitter.com/pppiroto
Copyright© 矢木 浩人 All Rights Reserved.