我有一个用例,其中用大量数据填充blocking queue
。
现在,我想在此队列的90%(任意值)已满时触发一个事件(调用方法)。
我想要实现这一点,以便可以对队列中的批量数据执行操作。
为此,我正在考虑扩展BlockingQueue
等LinkedBlockingQueue
的实现之一,并覆盖put(...)
方法,并执行类似的操作:
...
@Override
public void put(E e) {
super.put(e);
if(this.percentageUsed() >= 90)
fireEvent(this);
}
...
并在BlockingQueue
方法中编写处理fireEvent
对象的逻辑。
使用调度程序轮询每个n
seconds
的队列大小可以很好地做到这一点,但是如果我的应用程序中有许多这样的队列,它将造成混乱,无法处理所有调度程序。而且,这种方法会将所有内容保存在单个类文件中,并且代码更简洁。
请提供对此方法的专家见解。
答案 0 :(得分:0)
万一有人遇到类似的问题,我最终写了以下课程:
public class EventBlockingQueue<E> extends LinkedBlockingQueue<E> {
private static final long serialVersionUID = 1L;
private final int capacity;
private double eventThreshold;
private transient Consumer<EventBlockingQueue<E>> eventHandler;
/**
*
* @param capacity
* @param eventThreshold percentage value X (X => {X∈Z 1<=X<=100} ) at which the event is fired
* @param eventHandler method to be fired at threshold barrier
*/
public EventBlockingQueue(int capacity, double eventThreshold, Consumer eventHandler) {
super(capacity);
this.capacity = capacity;
this.eventThreshold = eventThreshold;
this.eventHandler = eventHandler;
}
@Override
public boolean add(E e) {
boolean addResult = super.add(e);
if(percentageUsed()>=eventThreshold && eventHandler!=null)
eventHandler.accept(this);
return addResult;
}
private int percentageUsed() {
return size()*100/capacity;
}
}