「Java ScheduledExecutorService を利用してタイマーを実装」の版間の差分
ナビゲーションに移動
検索に移動
(同じ利用者による、間の1版が非表示) | |||
1行目: | 1行目: | ||
− | ==Java ScheduledExecutorService を利用してタイマーを実装== | + | ==[[Java ScheduledExecutorService を利用してタイマーを実装]]== |
− | [[Java]] | + | [[Java]] | [[Category:コード片]] |
===Stopwatch.java=== | ===Stopwatch.java=== | ||
import java.util.ArrayList; | import java.util.ArrayList; | ||
import java.util.List; | import java.util.List; | ||
import java.util.concurrent.Executors; | import java.util.concurrent.Executors; | ||
− | import java.util.concurrent. | + | import java.util.concurrent.ScheduledExecutorSer[[vi]]ce; |
import java.util.concurrent.ScheduledFuture; | import java.util.concurrent.ScheduledFuture; | ||
import java.util.concurrent.TimeUnit; | import java.util.concurrent.TimeUnit; | ||
49行目: | 49行目: | ||
*/ | */ | ||
public static class Chronometer { | public static class Chronometer { | ||
− | private | + | private ScheduledExecutorSer[[vi]]ce scheduler; |
private long basetime; | private long basetime; | ||
private List<TickListener> listner; | private List<TickListener> listner; | ||
85行目: | 85行目: | ||
*/ | */ | ||
public void start() { | public void start() { | ||
− | final | + | final [[R]]unnable ticker = new [[R]]unnable() { |
public void run() { | public void run() { | ||
for (TickListener tl : listner) { | for (TickListener tl : listner) { | ||
93行目: | 93行目: | ||
}; | }; | ||
// 1秒ごとにイベントを発生 | // 1秒ごとにイベントを発生 | ||
− | tickHandle = scheduler. | + | tickHandle = scheduler.scheduleAtFixed[[R]]ate(ticker, 0, 1, TimeUnit.SECONDS); |
} | } | ||
/** | /** | ||
99行目: | 99行目: | ||
*/ | */ | ||
public void stop() { | public void stop() { | ||
− | scheduler.schedule(new | + | scheduler.schedule(new [[R]]unnable() { |
public void run() { | public void run() { | ||
tickHandle.cancel(true); | tickHandle.cancel(true); |
2020年2月16日 (日) 04:27時点における最新版
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 矢木浩人