计算机是如何实现Java定时器的?

计算机是如何实现Java定时器的?,java,timer,Java,Timer,网站上有关定时器的文章讨论了如何使用定时器编程 我问了一个不同的问题。 Java如何执行计时器方法 由于据说不使用while循环检查当前时间是否为所需时间点可以避免耗时的工作,因此我认为计时器不是简单地通过使用while循环连续检查当前时间并将其与所需时间点进行比较来实现的 谢谢大家! 根据javadoc 此类不提供实时保证:它安排任务 使用Object.wait(long)方法 如果查看代码,您将发现一个名为main loop的方法。前几行复制到下面 private void mainLoop

网站上有关定时器的文章讨论了如何使用定时器编程

我问了一个不同的问题。 Java如何执行计时器方法

由于据说不使用while循环检查当前时间是否为所需时间点可以避免耗时的工作,因此我认为计时器不是简单地通过使用while循环连续检查当前时间并将其与所需时间点进行比较来实现的


谢谢大家!

根据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();