10

网站上与 Timer 相关的文章讲了如何使用 Timer 进行编程。

我问一个不同的问题。Java如何执行Timer方法?

既然说不使用while循环检查当前时间是否是需要的时间点来避免耗时的工作,所以我认为Timer并不是简单地通过使用while循环不断检查和比较当前时间和期望的时间来实现的时间点。

谢谢!

4

2 回答 2

4

我认为 Timer 不是简单地通过使用 while 循环来不断检查当前时间并将其与所需时间点进行比较来实现的。

是的。唯一的优化是;它使用基于 nextExecutionTime 的优先级队列来处理任务。

JavaDoc 状态

Timer 对象是一个单一的后台线程,用于按顺序执行所有定时器的任务。定时器任务应该很快完成。如果一个定时器任务花费了过多的时间来完成,它就会“占用”定时器的任务执行线程。这反过来又会延迟后续任务的执行

定时器类包含

  1. TaskQueue这是 TimerTasks 的优先级队列,按 nextExecutionTime 排序。
  2. TimerThread(queue)定时器的任务执行线程,等待(queue.wait())定时器队列中的任务。

TimerThreadprivate void mainLoop() {
where Continuous将通过比较来while(true)继续检查任务nextExecutionTimecurrentTimeMillis

                    currentTime = System.currentTimeMillis();
                    executionTime = task.nextExecutionTime;
                    if (taskFired = (executionTime<=currentTime)) {

如果它到达然后调用

            if (taskFired)  // Task fired; run it, holding no locks
                task.run();
于 2014-06-20T18:49:07.387 回答
2

根据javadoc

此类不提供实时保证:它使用 Object.wait(long) 方法安排任务。

如果您查看代码,您会发现一个称为主循环的方法。下面复制前几行。

private void mainLoop() {
    while (true) {
        try {

而且...它在其中使用了一个while循环Object.wait()来进行等待。

于 2013-05-18T23:45:27.493 回答