基于以下代码完成工具类BoundedBlockingQueue,能支持多线程的同时写入,和阻塞取数,要求尽可能地高效
时间: 2024-05-12 08:20:49 浏览: 7
```java
import java.util.LinkedList;
import java.util.Queue;
public class BoundedBlockingQueue<T> {
private Queue<T> queue;
private int capacity;
public BoundedBlockingQueue(int capacity) {
this.capacity = capacity;
this.queue = new LinkedList<>();
}
public synchronized void put(T item) throws InterruptedException {
while (queue.size() == capacity) {
wait();
}
if (queue.size() == 0) {
notifyAll();
}
queue.add(item);
}
public synchronized T take() throws InterruptedException {
while (queue.size() == 0) {
wait();
}
if (queue.size() == capacity) {
notifyAll();
}
return queue.remove();
}
}
```
解释:
这个工具类使用了 synchronized 和 wait/notifyAll 机制来达到多线程并发写入和阻塞取数的效果。
put 方法使用 synchronized 保证了多线程并发写入时的线程安全性。当队列已满时,使用 wait 方法阻塞当前线程,等待其他线程take元素后唤醒。当队列未满时,使用 notifyAll 方法唤醒其他等待的线程,使它们有机会去写入元素。
take 方法同样使用 synchronized 保证了多线程并发取数时的线程安全性。当队列为空时,使用 wait 方法阻塞当前线程,等待其他线程put元素后唤醒。当队列非空时,使用 notifyAll 方法唤醒其他等待的线程,使它们有机会去取出元素。
注意,这里使用了 while 循环来判断队列是否满或空,而不是 if,是因为在多线程情况下,可能存在多个线程同时进行判断,只有使用 while 循环才能保证每个线程都正确地进行判断。