每秒 200 條波形數據點,需實時繪製,要求零丟包、低延遲、UI 線程不阻塞。
class RingBuffer<T> {
private final T[] buffer;
private int writeIdx = 0, readIdx = 0;
private final AtomicInteger count = new AtomicInteger(0);
@SuppressWarnings("unchecked")
public RingBuffer(int capacity) { buffer = (T[]) new Object[capacity]; }
public boolean offer(T item) {
int c = count.get();
if (c == buffer.length) return false; // 滿,丟包或阻塞
buffer[writeIdx] = item;
writeIdx = (writeIdx + 1) % buffer.length;
count.incrementAndGet();
return true;
}
public T poll() {
if (count.get() == 0) return null;
T item = buffer[readIdx];
buffer[readIdx] = null; // GC 友好
readIdx = (readIdx + 1) % buffer.length;
count.decrementAndGet();
return item;
}
}buffer.offer(data),滿時可選擇覆蓋最舊或阻塞。poll() 取出數據點,調用 invalidate() 重繪。兩個 RingBuffer 交換引用,消費者鎖定一個讀取,生產者寫入另一個,完全無鎖。