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

MyMemoWiki

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

提供: MyMemoWiki
2020年2月16日 (日) 04:27時点におけるPiroto (トーク | 投稿記録)による版
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)
ナビゲーションに移動 検索に移動

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

Java |

Stopwatch.java

  1. import java.util.ArrayList;
  2. import java.util.List;
  3. import java.util.concurrent.Executors;
  4. import java.util.concurrent.ScheduledExecutorService;
  5. import java.util.concurrent.ScheduledFuture;
  6. import java.util.concurrent.TimeUnit;
  7.  
  8. /**
  9. * タイマーを実装
  10. */
  11. public class Stopwatch {
  12. public static void main(String[] args) {
  13. Stopwatch me = new Stopwatch();
  14. me.test();
  15. }
  16. /**
  17. * Chronometer をテストする
  18. */
  19. public void test() {
  20. Watcher watcher = new Watcher();
  21. Chronometer chronometer = new Chronometer();
  22. chronometer.setOnTickListener(watcher);
  23. chronometer.setBaseTime(System.currentTimeMillis());
  24. chronometer.start();
  25. }
  26.  
  27. /**
  28. * Chronometer のイベントを拾うためのテストクラス
  29. *
  30. */
  31. public static class Watcher implements TickListener {
  32.  
  33. public void onTick(Chronometer chronometer) {
  34. System.out.println("seconds:" + chronometer.getPastSeconds());
  35. // 15秒カウントしたら止める
  36. if (chronometer.getPastSeconds() >= 15) {
  37. chronometer.stop();
  38. }
  39. }
  40. }
  41. /**
  42. * タイマー
  43. */
  44. public static class Chronometer {
  45. private ScheduledExecutorService scheduler;
  46. private long basetime;
  47. private List<TickListener> listner;
  48. private ScheduledFuture<?> tickHandle;
  49. public Chronometer() {
  50. listner = new ArrayList<TickListener>();
  51. scheduler = Executors.newScheduledThreadPool(1);
  52. }
  53. /**
  54. * 基準時間をセット
  55. * @param time
  56. */
  57. public void setBaseTime(long time) {
  58. this.basetime = time;
  59. }
  60. /**
  61. * 経過秒数を取得
  62. * @return
  63. */
  64. public long getPastSeconds() {
  65. return (System.currentTimeMillis() - this.basetime) / 1000;
  66. }
  67. /**
  68. * リスナー登録
  69. * @param lsnr
  70. */
  71. public void setOnTickListener(TickListener lsnr) {
  72. listner.add(lsnr);
  73. }
  74. /**
  75. * 開始
  76. */
  77. public void start() {
  78. final Runnable ticker = new Runnable() {
  79. public void run() {
  80. for (TickListener tl : listner) {
  81. tl.onTick(Chronometer.this);
  82. }
  83. }
  84. };
  85. // 1秒ごとにイベントを発生
  86. tickHandle = scheduler.scheduleAtFixedRate(ticker, 0, 1, TimeUnit.SECONDS);
  87. }
  88. /**
  89. * 終了
  90. */
  91. public void stop() {
  92. scheduler.schedule(new Runnable() {
  93. public void run() {
  94. tickHandle.cancel(true);
  95. }}, 0, TimeUnit.SECONDS);
  96. }
  97. }
  98. /**
  99. * タイマーイベントリスナー
  100. */
  101. public interface TickListener {
  102. void onTick(Chronometer chronometer);
  103. }
  104. }