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)

问题不应该是 Quoi 建议的(谢谢),因为我正在运行 Win7,所以它可能与 Win7 线程调度、优先级和我的机器上相当重的负载有关。

4

1 回答 1

1

toNanos()方法被使用ScheduledThreadPoolExecutor并且以下表达式都计算为完全相同的180000000000值:

TimeUnit.MINUTES.toNanos(3)

TimeUnit.SECONDS.toNanos(180)

因此,错误必须在其他地方,最有可能在旅游代码中或系统处于高负载状态。

于 2012-10-17T11:32:18.817 回答