当我使用带有 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 线程调度、优先级和我的机器上相当重的负载有关。