我有一个以高频率随机时间接收数据的传感器,并且我需要以指定频率(例如每秒 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/