假设您必须执行一项任务,要求每秒执行固定次数(比如20,000
)。
你会如何计划活动?
答案 0 :(得分:10)
每秒20K次,你需要忙着等待下一个间隔。我建议等到下一次它应该运行以消除抖动的影响。
long start = System.nanoTime();
long rate = 20000;
for(long i = 0; ; i++) {
// do something
long end = start + i * 1000000000L / rate;
while(System.nanoTime() < end);
}
你不能使用内置调度程序的原因是最小时间片是100微秒,每秒10K次,许多平台上的最小睡眠时间是1毫秒。
答案 1 :(得分:1)
如果您正在实施一个需要固定间隔执行的控制系统,而您想用Java实现它,请阅读real-time Java。
如果您只需要重复执行某些内容并且毫秒级粒度就足够了,请查看Timer或ScheduledThreadPoolExecutor。
如果您需要更精细的粒度(即每秒超过1000次),但您并不严格要求您的代码以精确的间隔执行,那么您可以通过Peter Lawrey的忙等待解决方案来解决问题。
答案 2 :(得分:1)
对于来自番石榴的RateLimiter来说,这听起来很完美。
修改强>
瞥了一眼RateLimiter
的实现 - 好吧,不是这么高的理想候选人,因为增加计数器它会使用同步块和睡眠。但是,如果可以更改粒度,则应该没问题,即将20.000
分成100
个200
个项目。
答案 3 :(得分:0)
这取决于你在该任务中做了什么,例如,如果你正在做一些网络,你试图做一些连接,它将取决于连接超时和一些其他因素。如果您正在执行一些基本操作,您将能够控制操作的上限,例如每秒最多20次操作,但由于pc中运行的其他任务,您将永远无法控制下限。这真的取决于你在做什么,在你正在运行的硬件上(特别是处理器)以及那台计算机是多么忙碌。