11

TimerTaskについて明確にしたいと思います。以下のコードがある場合:

timer.schedule(task, 60000);

タスクが次の1分で実行されるようにスケジュールされている場合、タスクオブジェクトはすでに実行されていますか?

コードのどこかでtask.cancel()を呼び出しましたが、呼び出しが妨げられないようです。

実行するタスク。呼び出しからの戻り値もログに記録しましたが、falseが返されます。

キャンセル方法のドキュメントを読んだときに、質問がありました。

TimerTaskをキャンセルし、Timerのキューから削除します。通常、呼び出しによってTimerTaskの実行が少なくとも1回妨げられなかった場合は、falseが返されます。後続の呼び出しは効果がありません。呼び出しによってスケジュールされた実行が実行されなかった場合はtrueを返し、それ以外の場合はfalseを返します。

1分の遅延の前にcancel()を呼び出したと思います。しかし、どうしてキャンセルがfalseを返したのでしょうか。

[タスク]はすでに実行されていますか?

手がかり/ヒント、さらにはこれについての説明を教えていただければ幸いです。ありがとうSO!

4

2 に答える 2

19
  • タスクが次の1分で実行されるようにスケジュールされている場合、タスクオブジェクトはすでに実行されています

いいえ、このタスクのrunメソッドを正確に60秒で呼び出します。task.cancel()が返される場合false、それは3つのことを意味する可能性があります。

  • タスクは1回限りの実行がスケジュールされており、すでに実行されていますOR
  • タスクがスケジュールされなかったまたは
  • タスクはすでにキャンセルされていますまたは

したがって、cancelタスクをスケジュールしてから60秒前に呼び出すことが確実な場合は、タスクを数回呼び出して後続の結果を取得するかcancel、別のタスクでキャンセルを呼び出す可能性があります。


一般的に、 ScheduledExecutorServiceを優先してTimerに反対することをお勧めします

次の方法で目的の機能を実現できます。

ScheduledExecutorService.schedule(callable、delay、timeunit)

ScheduledExecutorServiceが推奨される方法である理由をここに概説します。

  • タイマーはシステムクロックの変化に敏感である可能性がありますが、ScheduledThreadPoolExecutorはそうではありません

  • タイマーには実行スレッドが1つしかないため、実行時間の長いタスクは他のタスクを遅らせる可能性があります。ScheduledThreadPoolExecutorは、任意の数のスレッドで構成できます。さらに、必要に応じて、作成されたスレッドを完全に制御できます(ThreadFactoryを提供することにより)

  • TimerTaskでスローされたランタイム例外は、その1つのスレッドを強制終了し、タイマーを無効にします:-( ...つまり、スケジュールされたタスクは実行されなくなります。ScheduledThreadExecutorは、ランタイム例外をキャッチするだけでなく、必要に応じて処理できるようにします(afterExecuteメソッドをThreadPoolExecutor)。例外をスローしたタスクはキャンセルされますが、他のタスクは引き続き実行されます。

于 2011-11-10T03:47:50.723 に答える
4

コードがなぜ戻るのかわかりませんfalse

次のコードはを出力しtrueます。

import java.util.Timer;
import java.util.TimerTask;


public class Test {
    public static void main(String[] args) {
        Timer timer = new Timer();
        TimerTask task = new TimerTask() {

            @Override
            public void run() {
                System.out.println("hi");
            }

        };
        timer.schedule(task, 60000);
        System.out.println(task.cancel());
    }
}

最後printlnがコメント化されている場合、プログラムはを出力しhiます。

于 2011-11-10T03:46:20.723 に答える