我有一个程序,我想在其中绘制不断更新的数据(顺便说一下,它是microhpone行数据)。数据是一个8000长度的双精度数组,我真的不在乎"丢失"数据,因为在使用绘制方法之间会被覆盖。
在我天真的实现中,令人讨厌的是存在同步问题,即在绘画程序进行时更新音频数据。
我也知道我对Java和它的Concurrency包有点过时了,但我的第一个反应是在共享数据代码周围放置同步块。不出所料,这有时会阻塞图形线程,所以我认为可能有更好的方法可以做到这一点。
从本质上讲,我只是在同步方面没有太多经验,在某个地方有点搞砸了。我想知道,对这些问题有更好理解的人是否能够提出一个更优雅的解决方案,而不会阻塞图形线程?
我天真的代码:
Object lock = new Object();
double[] audio = new double[8000]
// array size is always exactly 8000
public update( double[] audio ) {
synchronized( lock ) {
this.audio=audio; // and some brief processing
}
repaint();
}
public void paint( Graphics g ) {
synchronized( lock ) {
// draw the contents of this.audio
}
}
自我回答,除非有更聪明的人能提供更好的东西,否则我只需在例程开始时保存一个对音频数组的引用并从中提取,然后对音频缓冲区的任何更新都会在一个单独的数组中进行计算,然后在一个步骤中将this.adio分配给新数组。
它似乎起作用了,尽管油漆程序偶尔会闪烁,但它与以前完全不同,因为同步阻挡,它在大约10%的时间内都在明显闪烁。音频数据也不会在绘制例程的中途更新。所以…问题解决了。可能
double[] audio = new double[8000]
// array size is always exactly 8000
public update( double[] audio ) {
// do any brief processing
this.audio=audio; // the reference is re-assigned in one step
repaint();
}
public void paint( Graphics g ) {
audioNow = this.audio; // save the reference
// draw the contents of audioNow (not this.audio)
}