java实现环形缓冲区(附完整源码)
时间: 2023-10-17 22:25:47 浏览: 94
基于C语言开发的环形缓冲区.zip
以下是Java中使用数组实现环形缓冲区的完整源代码:
```java
public class CircularBuffer {
private int head = 0; // 缓冲区头部
private int tail = 0; // 缓冲区尾部
private int size = 0; // 缓冲区已使用大小
private int capacity; // 缓冲区容量
private int[] buffer; // 缓冲区数组
public CircularBuffer(int capacity) {
this.capacity = capacity;
this.buffer = new int[capacity];
}
// 向缓冲区写入数据
public synchronized void write(int data) throws InterruptedException {
while (isFull()) {
wait();
}
buffer[tail] = data;
tail = (tail + 1) % capacity;
size++;
notifyAll();
}
// 从缓冲区读取数据
public synchronized int read() throws InterruptedException {
while (isEmpty()) {
wait();
}
int data = buffer[head];
head = (head + 1) % capacity;
size--;
notifyAll();
return data;
}
// 判断缓冲区是否已满
public boolean isFull() {
return size == capacity;
}
// 判断缓冲区是否为空
public boolean isEmpty() {
return size == 0;
}
}
```
使用一个数组来保存缓冲区数据,head和tail分别表示缓冲区头部和尾部的索引,size表示缓冲区已使用的大小,capacity表示缓冲区容量。使用循环数组的方式来实现环形缓冲区,当tail到达数组末尾时,将其置为0,从而继续往数组头部写入数据。当head到达数组末尾时,将其置为0,从而继续从数组头部读取数据。使用synchronized关键字来保证线程安全,当缓冲区已满或为空时,调用wait()方法使线程等待,直到有空间写入或有数据可读取时,使用notifyAll()方法通知其他等待中的线程。
阅读全文