实时采样模式

时间:2014-06-16 21:55:33

标签: java multithreading concurrency thread-safety sampling

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

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

我认为某种生产者 - 消费者模式在这里是合适的,但由于我缺乏并发经验,我正在努力进行适当和有效的实施。

当我想要使用所有生成的数据时,我理解ArrayBlockingQueue是一个很好的数据结构可供选择,但在这种情况下我只想消耗所产生的最新值(或者如果没有产生任何值,前一时期的价值),这恰好是指定的频率(例如每秒一次)。

1 个答案:

答案 0 :(得分:1)

简单回答,使用循环队列。

//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个将为null,您将获得NullPointerException。将它们循环设置为某个虚拟值。

我也应该解释一下代码。 (i + 1)%N代码将强制数字在0和N-1之间。当它达到i = 59时,则(59 + 1)%60 = 60 mod 60 = 0.并且循环继续。