4

TimeUnit.MINUTESと値3でScheduledExecutorを使用すると、ジョブは3分から約3分10秒の範囲の遅延で実行されます。はい、scheduleWithFixedDelay()を使用していますが、ジョブは数ミリ秒しか実行されません。

java.util.concurrentのドキュメントから、TimeUnit.MINUTES*3がTimeUnit.SECONDS*180と等しくないが、タイミングの精度が低くなるという明確な兆候は見つかりませんでした。

私の場合、分スケールの精度は完全に許容できます。これが本当に意図された行動なのか、それとも私が心配すべきことなのか、誰かが知っているのだろうかと思っていました...

私の質問は答えられましたが、誰かがそれをテストすることに興味があるかもしれない場合は、ここに小さなサンプルコードを含めます:

public static void main(String[] args) {

    ScheduledExecutorService exec = Executors
            .newSingleThreadScheduledExecutor();

    exec.scheduleWithFixedDelay(new UpdateTask(), 0, 3, TimeUnit.MINUTES);

    Scanner sc = new Scanner(System.in);

    boolean quitted = false;
    while (!quitted) {
        String command = sc.nextLine();
        if (command.equals("q"))
            quitted = true;
    }
    exec.shutdown();

}

private static final class UpdateTask implements Runnable {

    @Override
    public void run() {
        System.out.println("bg process running (" + (new Date()) + ")");
    }
}

そのコードスニペットは次のようになりました(他のすべての種類の作業を行っているときにシステムのバックグラウンドに残された場合)。

bg process running (Thu Oct 18 10:49:48 EEST 2012)
bg process running (Thu Oct 18 10:52:54 EEST 2012)
bg process running (Thu Oct 18 10:55:57 EEST 2012)
bg process running (Thu Oct 18 10:58:59 EEST 2012)
bg process running (Thu Oct 18 11:02:02 EEST 2012)
bg process running (Thu Oct 18 11:05:05 EEST 2012)
bg process running (Thu Oct 18 11:08:07 EEST 2012)

私がWin7を実行しているので、問題はQuoiが提案したものではないはずです(ありがとう)。したがって、おそらくWin7スレッドのスケジューリング、優先順位、および私のマシンの非常に重い負荷に関係しています。

4

1 に答える 1

1

toNanos()メソッドはによって使用されScheduledThreadPoolExecutor、次の式は両方ともまったく同じ180000000000値に評価されます。

TimeUnit.MINUTES.toNanos(3)

TimeUnit.SECONDS.toNanos(180)

したがって、エラーは他の場所にある必要があります。おそらくツアーコードにあるか、システムに高負荷がかかっています。

于 2012-10-17T11:32:18.817 に答える