ScheduleExecutorService
を使用して一定の日数後に深夜にタスクを実行しようとしています。この方法は、最初に実行されるとdelay
とinterval
によってspecifedとして実行されていないように今それはそうScheduledExecutorServiceが予期したとおりに動作しない
public void schedule (int aInterval)
{
String timezone = TimeZone.getDefault().getID();
ZoneId z = ZoneId.of(timezone);
ZonedDateTime now = ZonedDateTime.now(z);
LocalDate tomorrow = now.toLocalDate().plusDays(1);
ZonedDateTime tomorrowStart = tomorrow.atStartOfDay(z);
Duration duration = Duration.between(now , tomorrowStart);
long millisecondsUntilTomorrow = duration.toMillis();
long interval;
if (aInterval * 24 * 60 * 60 > Long.MAX_VALUE)
{
interval = Long.MAX_VALUE;
}
else
{
interval = aInterval * 24 * 60 * 60;
}
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1, new ThreadFactory() {
public Thread newThread(Runnable r) {
Thread thread = new Thread(r);
// allow the JVM to kill the scheduled task
thread.setDaemon(true);
return thread;
});
scheduler.scheduleAtFixedRate(new Runnable()
{
public void run() {
System.out.println(String.format("schedule::run() at %1$Td.%1$tm.%1$tY %1$tH:%1$tM:%1$tS \n", System.currentTimeMillis()));
doTask();
}
},
delay,
interval,
TimeUnit.SECONDS);
}
:私の方法は、私のTomcat 8の内部で実行され、このようになります。例えば。
...
schedule::run() at 10.08.2017 17:57:09
schedule::run() at 10.08.2017 17:57:15
schedule::run() at 10.08.2017 17:57:21
schedule::run() at 10.08.2017 17:57:27
schedule::run() at 10.08.2017 17:57:27
schedule::run() at 10.08.2017 17:57:33
schedule::run() at 10.08.2017 17:57:33
schedule::run() at 10.08.2017 17:57:34
...
ので、間隔が何とか時間をかけて短くなってきている:私は私のスタックトレースにdelay=60
とinterval=5
を設定すると、それはこのようになります。ここで何が起こっているのですか?私の方法に問題はありますか?
スレッド工場のアイデアをありがとう、それは正常に動作します。しかし、タイミング機能はまだ機能しません。どのような間隔のtimeunitを使用しても、しばらくしてから関数が狂ってしまい、runnableをより頻繁に実行し続けることになります。 'doTask()'は2〜3秒以上かかることはありませんが、60000ミリ秒の間隔を設定しても、問題は起こり続けます。 – flixe