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