ある処理を○秒ごとにしたいんです。
そのある処理の処理時間に関係なく。
単純にsleepを使うと、○+(処理時間)秒後になってしまいますよね?
こういう場合どういう方法がありますか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答3件
0
既に解決済みになっていますが、ScheduledExecutorService
を含むConcurrent Utilitiesを使う方法もご紹介しておきます。
ScheduledExecutorService
を使うと、スレッドの数を制御することが簡単になったりします。
より複雑なタイマー処理を行う場合に便利です。
例:
lang
1// Java8以降向けの書き方(ラムダ式使用) 2 3// import java.util.concurrent.*; 4 5// スレッドプール:スレッドを使いまわせる(初期サイズ2) 6ScheduledExecutorService es = Executors.newScheduledThreadPool(2); 7es.schedule(() -> { 8 System.out.println("A: 5秒後1回だけの処理"); 9}, 5L, TimeUnit.SECONDS); 10es.scheduleAtFixedRate(() -> { 11 System.out.println("B: 3秒ごとの処理"); 12}, 3L, 3L, TimeUnit.SECONDS);
参考リンク:
Timerを使う。周期的に実行したり、一定時間後に実行したり - Java How To Programming
※3つのタイマーの比較を掲載している
http://www.02.246.ne.jp/~torutk/javahow2/timer.html
ScheduledExecutorService
インターフェイス (java.util.concurrent.ScheduledExecutorService)
- Java SE 8 API ドキュメント
https://docs.oracle.com/javase/jp/8/docs/api/java/util/concurrent/ScheduledExecutorService.html
投稿2015/12/16 04:52
総合スコア9396
0
java.util.Timer クラスというものがあります。
Java
1public class SampleTask extends TimerTask { 2 public void run() { 3 System.out.println("サンプルです。"); 4 } 5} 6 7Timer timer = new Timer(); 8timer.schedule(new SampleTask(), 5000, 10000);
上記ですと、5秒後に一度実行し、以後10秒毎に実行されます。
投稿2015/12/16 02:33
総合スコア736
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

0
ベストアンサー
Timerオブジェクトを作り、これに定期的にタスクを実行させるという方法が一般的です。
メインスレッドでsleep()していたフローをそのまま生かしたいなら、メインスレッドではsleep()でなくwait()を使い、TimerタスクではnotifyAll()を呼んでwait()を解放させればいけます。
以上の説明がよくわからなかったならおっしゃってください。もう少し詳しく解説します。
投稿2015/12/16 02:32
総合スコア5570
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/12/16 04:54