当我使用带有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线程调度,优先级和我机器上相当大的负载有关。
答案 0 :(得分:1)
toNanos()
使用 ScheduledThreadPoolExecutor
方法,并且以下表达式都评估为完全相同的180000000000
值:
TimeUnit.MINUTES.toNanos(3)
和
TimeUnit.SECONDS.toNanos(180)
因此,错误必须在其他地方,很可能是在旅游代码中或系统处于高负荷状态。