计算机是如何实现Java定时器的?
网站上有关定时器的文章讨论了如何使用定时器编程 我问了一个不同的问题。 Java如何执行计时器方法 由于据说不使用while循环检查当前时间是否为所需时间点可以避免耗时的工作,因此我认为计时器不是简单地通过使用while循环连续检查当前时间并将其与所需时间点进行比较来实现的计算机是如何实现Java定时器的?,java,timer,Java,Timer,网站上有关定时器的文章讨论了如何使用定时器编程 我问了一个不同的问题。 Java如何执行计时器方法 由于据说不使用while循环检查当前时间是否为所需时间点可以避免耗时的工作,因此我认为计时器不是简单地通过使用while循环连续检查当前时间并将其与所需时间点进行比较来实现的 谢谢大家! 根据javadoc 此类不提供实时保证:它安排任务 使用Object.wait(long)方法 如果查看代码,您将发现一个名为main loop的方法。前几行复制到下面 private void mainLoop
谢谢大家! 根据javadoc 此类不提供实时保证:它安排任务 使用Object.wait(long)方法 如果查看代码,您将发现一个名为main loop的方法。前几行复制到下面
private void mainLoop() {
while (true) {
try {
而且。。。它在其内部使用while循环以及Object.wait()
来进行等待
我认为定时器并不是简单地通过使用while循环来实现的
检查并比较当前时间与所需时间点
是的。唯一的优化是;对于任务,它使用基于nextExecutionTime的优先级队列
JavaDoc状态
Timer对象是一个后台线程,用于
按顺序执行计时器的所有任务。计时器任务应
快速完成。如果计时器任务花费的时间过长,
它“占用”计时器的任务执行线程。这反过来又会延迟
后续任务的执行
计时器类包含
TaskQueue
这是TimerTasks的优先级队列,在nextExecutionTime上排序TimerThread(queue)
计时器的任务执行线程,它等待(queue.wait()
)计时器队列上的任务TimerThread
具有private void mainLoop(){
其中continuous
while(true)
将通过比较nextExecutionTime
与currentTimeMillis
currentTime = System.currentTimeMillis();
executionTime = task.nextExecutionTime;
if (taskFired = (executionTime<=currentTime)) {
1.转到;2.寻找答案;3.???;4.利润。利润?这是什么意思?这是对以下内容的引用:有趣。但我太笨了,以至于我不明白它的意思。:(谢谢。那么Object.wait()是如何实现的?我仍然假设它不使用while循环。
Object.wait()
是一个“内置”的方法,该方法是用本机代码实现的,而不是用Java实现的。它利用底层操作系统的设施来挂起线程的执行(因此操作系统的调度程序不会给它任何CPU时间)。非常感谢!这就是我的想法。我研究了操作系统来寻找答案。那么操作系统如何在不花费CPU时间的情况下实现它?有没有链接让我可以找到参考?@user1914692就Java而言,答案是你不应该在意。API文档和JLS文档记录了你可以预期的行为,我怀疑JL现在,如果你真的想知道操作系统本身是如何实现的——更模糊的描述,你应该得到一本关于操作系统概念/设计的书,比如。如果你真的真的想知道,检查OpenJDK代码并深入研究内核代码,它们都是开放的。我想你会看到pthread
magic,但真的不知道。谢谢。我还听说,虽然Timer或thread.sleep不消耗CPU时间,但它们并不准确。对吗?如果我想准确地控制多个线程和事件的时间点,我应该在哪里找到详细的参考?如果Java Timer使用循环,那么计时器的准确度如何?
if (taskFired) // Task fired; run it, holding no locks
task.run();