Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java定时器:如何选择+有哪些限制?_Java_Timer - Fatal编程技术网

java定时器:如何选择+有哪些限制?

java定时器:如何选择+有哪些限制?,java,timer,Java,Timer,我需要写一些代码来强调使用rxtx测试RS232通信注意:这个问题不是关于串行通信的,所以请不要去那里,我想使用某种计时器任务定期发送字节 关于各种应用程序使用哪种定时器类,在线上有什么指导方针吗?我不确定我是应该用还是其他什么 它们开始崩溃的频率是多少?我猜这与操作系统的时间片是一致的。忘了Windows中的时间片是什么,1-10秒似乎就是我记忆中的时间片。我想以最快的频率跑步,这不会给我的电脑带来问题;我总是可以一次从我的串行端口吐出更多的字节,我只想尽可能多地以周期性的方式来做。如果你想要

我需要写一些代码来强调使用rxtx测试RS232通信注意:这个问题不是关于串行通信的,所以请不要去那里,我想使用某种计时器任务定期发送字节

关于各种应用程序使用哪种定时器类,在线上有什么指导方针吗?我不确定我是应该用还是其他什么


它们开始崩溃的频率是多少?我猜这与操作系统的时间片是一致的。忘了Windows中的时间片是什么,1-10秒似乎就是我记忆中的时间片。我想以最快的频率跑步,这不会给我的电脑带来问题;我总是可以一次从我的串行端口吐出更多的字节,我只想尽可能多地以周期性的方式来做。

如果你想要一个高频率但又精确的频率,我不会使用计时器

我曾经在Delphi做过类似的事情,为步进电机提供快速脉冲。为此,我可以自由地消耗尽可能多的CPU时间,因此我运行了一个严密的循环,检查Windows的高精度计时器,直到经过适当的时间,然后执行我需要的操作

这在Java中并不十分方便,但我建议使用类似的方法,使用System.nanoTime

你可能会发现你错过了最后一次。如果是这样的话,用某种方式处理它。不管怎样,要么赶紧做你的动作,要么做任何需要做的事情来补偿错误——也许等待整个字符空间通过,或者做任何事情。此外,您可能希望修改到下一个事件的时间间隔。换句话说,要准确处理正常抖动所需要的一切

如果您没有在循环中大量创建对象,那么没有合理的理由让垃圾收集器启动,因此您的计时有合理的机会保持准确

更新

乔纳森·范伯格(Jonathan Feinberg)告诫我ScheduledExecutorService就是为这种事情而设计的。我认为它不适合OP的高频、高精度要求

我这里有一个链接,有人在Sun论坛上抱怨说:他的重复频率只有200毫秒,但他却经历了超过1秒的延迟


Java方法的问题在于,它主要是以跨平台的方式使用操作系统的设施来实现这一点,并且不会对系统的其余部分产生负面影响。这些都是妥协;当您优先考虑快速准确地获取大量事件,并且在约束方面有一定的回旋余地时,就有可能构建一个效果更好的解决方案。这正是我所概述的。

不要使用摆动计时器;这是早期秋千时代的一个笑话


ScheduledExecutorService是其余两个竞争者中更通用、更可配置的。它可以接受纳秒精度,但根据平台的不同,当然不能提供比毫秒精度更好的精度。您需要一个实时JVM,以达到纳秒级的精度。

为什么不创建自己的线程呢

public MyThread extends Thread {
    int frequency = 10; // number per second
    AtomicBoolean shutDown = new AtomicBoolean();

    public void run() {
        while (!shutDown.get()) {
            long startTime = System.nanoTime() / 1000000;
            try {
                performAction();
            } catch (Exception e) {
                System.err.println(e.toString());
            }
            long elapsedTime = startTime - System.nanoTime() / 1000000;

            long sleepTime = 1000 / frequency - elapsedTime;
            if (sleepTime > 0) {
                try {
                    Thread.sleep(sleepTime);
                } catch (InterruptedException e) {
                    // ignored
                }
            }
        }
    }
}

如果您必须提高Windows系统上计时器的分辨率,您可以使用。

另请参阅,我宁愿使用ScheduledExecutorService,因为它提供了更多处理中断等问题的功能。,另外,使用常量值调用Thread.sleep并不意味着任务将定期执行,因为这取决于任务运行所需的时间。如果只是出于学术原因,请更新以考虑这些因素。请参阅如何正确处理InterruptedException,您不应忽略它。感谢Steve,但这超出了问题的范围。不是真的-取消是相当普遍的;我还想确保避免并发或其他问题。鉴于Java受操作系统的支配,您链接到建议使用System.nanoTime和手动执行事件调度的资源在受影响的平台上也不会更好。我没有高频率或高精度的要求,我只是想把事情做得尽可能好,不必太努力。我以前做过硬实时的工作:在PXA270上的QNX RTOS中,它有几百微秒的抖动,最坏的情况是调度任务,对大多数事情来说都足够好。。。但对于坚如磐石的计时,您确实需要一个具有高优先级中断的处理器,您可以对其进行大量控制。但是+1是用来培养优秀人才的points@Jason:谢谢你给我的+1:希望你一切顺利@乔纳森:比起标准解决方案,我放弃控制的频率要低得多,因此我也很少成为操作系统的受害者。不过,我不介意你们不愿意理解这一点。哦,你们两个别再争吵了:-总是会有可移植性和性能的权衡。当您可能浪费CPU周期时,旋转等待解决方案规则。