私は、常に更新されているデータを描画したいプログラムを持っています (ちなみに microhlone-line-data です)。データは長さ 8000 の double の配列です。paint メソッドのテイク間でオーバーライドされるデータの「損失」についてはあまり気にしません。
私の単純な実装では、描画ルーチンの進行中にオーディオデータが更新される同期の問題があることが明らかになりました。
また、Java と 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
}
}