Java计时器任务比正常运行速度慢

Java计时器任务比正常运行速度慢,java,timer,Java,Timer,我正在编写的一个应用程序的一部分使用了一个计时系统。计时器应每毫秒滴答一次 在我的计时器里,我有这些变量 private static final int DELAY_IN_MILLISECONDS = 0; private int intervalInMilliseconds = 1; 我按如下方式启动计时器: timer = new Timer(); timer.schedule(new Task(), DELAY_IN_MILLISECON

我正在编写的一个应用程序的一部分使用了一个计时系统。计时器应每毫秒滴答一次

在我的计时器里,我有这些变量

    private static final int DELAY_IN_MILLISECONDS = 0;
    private int intervalInMilliseconds = 1;
我按如下方式启动计时器:

        timer = new Timer();
        timer.schedule(new Task(), DELAY_IN_MILLISECONDS,
            getIntervalInMilliseconds());
然而,一秒钟后,他只达到了+-100毫秒,而不是1000毫秒

虽然他过去工作得很好,但直到我在游戏的另一部分添加了代码。我很确定我没有改变计时器,但是他变得比正常人慢了(起初他工作得很好)

我的计时器是否可能因为应用程序需要太多的CPU时间来完成其他事情而运行较慢?(这是我正在创造的一个游戏)。如果是这样,解决这个问题的常规方法是什么?记住,比赛的顺利进行比计时更重要

提前谢谢


编辑:有没有办法找出你的应用程序的哪一部分是“瓶颈”,比如检查他在哪里使用了最多的资源等?

我实际上有一点特别的解决方案。 我停止了每毫秒数一次,只是做了+=15毫秒来计算睡眠时间()

计时器现在运行平稳,一分钟后,我与实际时间相差不到1秒

谢谢大家的帮助,但任何其他(不太特别的)解决方案仍然非常受欢迎


编辑:我是因为Boris才得到这个方法的,所以如果你愿意的话,你可以把你的评论作为答案发表:)

如果你追求的是计划的长期准确性,那么你应该使用这个方法。如果您持续延迟地重新安排任务,则
计时器
实例无法补偿其过去的计时错误


如果短期准确性也是一个问题,那么您应该切换到Scheduled Executor服务,该服务使用更精确的低级技术来安排任务。

您不能每毫秒勾选一次。
计时器使用
睡眠
等待-
睡眠
的分辨率最多为15毫秒左右。如果不忙着等待和使用
System.nanoTime()
,您的分辨率就不能超过15毫秒左右。@BoristheSpider好的,我已经能够验证了,谢谢。尽管如此,它过去还是快得多。但是我假设整个问题都在于唤醒,它实际上比15毫秒慢。那么我可能应该多看看线程。编辑:而且,即使是15毫秒,他现在使用的时间也应该少于10秒,我希望:/n无论你选择哪种方法,你都不能以那种分辨率睡眠。如果你想获得1ms的分辨率,你就得忙着等待。您可以尝试,但我不知道这会带来什么改进。@Boristeider我拥有经过大量测试的代码,其精度(精度是错误的术语)低于1ms。我使用计划执行器服务。为了完整性,我应该补充一点,精度是中期的:每秒钟我都会得到适当数量的计划任务,当分辨率为1ms时,可能存在一些抖动。