java - 如何以每秒几个固定速率准确安排任务

标签 java multithreading

我目前正在使用

 ScheduledFuture<?> schedulerFuture = scheduler.scheduleAtFixedRate(taskMaker, 0 , period, TimeUnit.MICROSECONDS);                
 ScheduledFuture<?> timerFuture = timer.schedule(timeAnalyser, time, TimeUnit.MICROSECONDS);

每秒执行许多任务,在多个线程中也是异步的。问题是,我得到的结果不准确。例如,当我想在一秒钟内在第一个线程中执行 3 个任务,在第二个线程中执行 7 个任务,在第三个线程中执行 5 个任务时,有时我会得到 4、7、6 或 3、6、6。这并不是说当使用更大的数字时,处理器无法做到这一点,但我每秒要执行的任务越多,不准确度就越大。可能是因为 timer(停止 taskMaker)的启动时间与 taskMaker 不完全相同?

有什么改变的建议吗?无论如何,使用 SchedulesExecutorService 执行如此高频率的任务是否正确?

最佳答案

各种ExecutorService的实现使用一个工作队列,其目的是只要工作任务可用就使用下一个可用的线程来执行它,如果没有线程可用(忙),而不是创建一个新线程(在指定可用线程的限制内,如果达到此数量,它将等待线程变为可用),因此您无法控制线程......尤其是不执行哪些任务。

对于这样的 Executor,您应该考虑实现您自己的 Executor,它可能会针对您的频率(3、7 和 5)使用 Executors.newSingleThreadScheduledExecutor()。 例如:

ScheduledExecutorService exec1 = Executors.newSingleThreadScheduledExecutor();
ScheduledExecutorService exec2 = Executors.newSingleThreadScheduledExecutor();
ScheduledExecutorService exec3 = Executors.newSingleThreadScheduledExecutor();

exec1.scheduleAtFixedRate(task, 0, 1000 / 3, TimeUnit.MILLISECONDS);
exec2.scheduleAtFixedRate(task, 0, 1000 / 7, TimeUnit.MILLISECONDS);
exec2.scheduleAtFixedRate(task, 0, 1000/5, TimeUnit.MILLISECONDS);

关于java - 如何以每秒几个固定速率准确安排任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30750712/

相关文章:

java - 如何编写 import 语句来引用 jar 中的 java 类?

读取文本文件时Java不返回值

c - 简单的C程序来说明乱序执行?

ios - MKOverlayView性能

android - 如何在 Android 中调试多线程?

java - 为什么这段代码的结果是不确定的?

java - JDBC getconnection 在 Mac 上不起作用

java - 如何在 Java 中将 Java 集合转换为 Kotlin 序列(反之亦然)?

java - Spring websocket线程模型

java - 为什么 Java Collections 有 0 或 1 个元素的助手,但没有更多元素?