Java(JDK1.7)で、指定した時刻になったら処理するというメソッドを作りたいです。
以下ソースの通り、"2018/11/24 16:04:10"と、"2018/11/24 19:00:10"を
timerにセットしているのですが、そのまま処理が終了してしまい、指定時刻になっても何も起きません。
どこが悪いのでしょうか。
java
1package test; 2 3import java.text.ParseException; 4import java.text.SimpleDateFormat; 5import java.util.Date; 6import java.util.Timer; 7import java.util.TimerTask; 8 9import org.junit.Test; 10 11public class Test3 { 12 13 @Test 14 public void timers() throws InterruptedException, ParseException { 15 TimerTask task1 = new NamedTask("タスクA"); 16 TimerTask task2 = new NamedTask("タスクB"); 17 Timer timer = new Timer("複数タスクタイマー"); 18 19 System.out.println("main start:" + new Date()); 20 21 SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); 22 23 timer.schedule(task1, sdf.parse("2018/11/24 16:04:10")); 24 timer.schedule(task2, sdf.parse("2018/11/24 19:00:10")); 25 26 //timer.schedule(task1, 0, 2 * 1000); 27 //timer.schedule(task2, 0, 3 * 1000); 28 29 //TimeUnit.SECONDS.sleep(10); 30 timer.cancel(); 31 System.out.println("main end :" + new Date()); 32 } 33 34 class NamedTask extends TimerTask { 35 36 private String name; 37 38 public NamedTask(String name) { 39 this.name = name; 40 } 41 42 @Override 43 public void run() { 44 System.out.printf("%-7s:%s%n", name, new Date()); 45 } 46 } 47} 48
気のせいだったら申し訳ないですが、その時間(瞬間)になったら実行するのなら、バックグラウンドでずっと実行していなくてはいけないのでは?違いましたらすいません。
おっしゃる通りです。永遠とバックグラウンドでプロセスを実行して、指定時刻になったら特定の処理を実施するという処理を作成したいと考えています。通常、cronでするような処理だと思いますが、今回はローカルのJunit起動から実施したいです。
今さっとやってみましたが、cancelをすぐ呼び出しているからでは?cancelをするとスケジュールは全て破棄されます。
ご確認、ありがとうございます。timer.cancelを外しても、私の環境ではそのままプロセスが終了してしまい、timerにscheduleした処理は実行されませんでした。Junitで実行しているのが駄目なのでしょうか?
cancelを呼び出したあと、出力して関数の最後になるからです。私はJUnitを使っていないのでmain関数でやっていますが、while(boolean変数)でスケジュール後ループして、後のタイマーが呼び出されたときwhileの引数をfalseにすればいいかと。なお、whileの中には1msでも待機する関数を呼び出してください。長文失礼しました。
ありがとうございます! うまくいきました。

回答1件
あなたの回答
tips
プレビュー