java - 实时采样模式

标签 java multithreading concurrency thread-safety sampling

我有一个以高频率随机时间接收数据的传感器,并且我需要以指定频率(例如每秒 1 个数据点)指定大小(例如 60 个数据点)的滚动时间序列窗口。

采样值应该是从传感器读取的最新值(即读取之间的所有其他值都应被丢弃)。

我认为某种生产者-消费者模式适合这里,但由于我缺乏并发经验,我正在努力寻找正确且有效的实现。

当我想使用生成的所有数据时,我知道 ArrayBlockingQueue是一个很好的数据结构选择,但在这种情况下,我只想消耗最新产生的值(或者如果没有产生值,则消耗前一时期的值),并且恰好以指定的频率(例如每秒一次) .

最佳答案

简单的答案,使用循环队列。

//init
int i = 0; 
final int N = 60;
Point[] data=new Point[N];
for(i=0;i<N;i++)data[i]=new Point();//dummy points to start with

//update
void addPoint(Point p){
   data[i] = p;
   i = (i+1)%N;
}

请注意,如果没有正确初始化数据,前 60 将为空,并且您将得到 NullPointerException。将它们循环设置为某个虚拟值。

我或许也应该解释一下代码。 (i+1)%N 代码将强制数字介于 0 和 N-1 之间。当i=59时,则(59+1)%60 = 60 mod 60 = 0。如此循环。

关于java - 实时采样模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24252875/

相关文章:

java - 向 Mockito.any() 提供类以使 verify() 调用明确的正确语法是什么?

c++ - 在多线程上下文中安全使用映射中的引用

java - 通过另一个文件中的 Controller 实例引用在 MainController 中设置文本字段

java - Java 准备语句中的通配符问题

java - 在 Android 应用程序的 mysql DB 中存储图像的最佳选择?

c++ - 为什么在std::condition_variable notify_all的运行速度比notify_one更快(在随机请求上)?

java - JVM 在创建线程并在其中执行网络操作时突然关闭

java - ThreadPoolExecutor 创建的线程在关闭后仍保持运行

asp.net - ASP.Net静态对象

multithreading - 为什么此Scala代码在一个线程中执行两个Future?