
com.github.segmentio.safeclient.queue.NonLockingQueue Maven / Gradle / Ivy
package com.github.segmentio.safeclient.queue;
import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
public class NonLockingQueue implements IBatchQueue {
private ConcurrentLinkedQueue queue;
private AtomicBoolean lock;
private AtomicInteger count;
public NonLockingQueue() {
queue = new ConcurrentLinkedQueue();
lock = new AtomicBoolean(false);
count = new AtomicInteger(0);
}
public int add(T item) {
int size = -1;
if (queue.add(item)) {
size = count.addAndGet(1);
} else {
size = count.get();
}
return size;
}
public int size() {
return count.get();
}
public List flush(int maxAmount) {
List list = null;
if (lock.compareAndSet(false, true)) {
int flushed = 0;
list = new LinkedList();
T item = queue.poll();
while (item != null) {
list.add(item);
flushed += 1;
if (flushed <= maxAmount) {
item = queue.poll();
} else {
break;
}
}
// subtract the amount we just removed
count.addAndGet(-list.size());
lock.set(false);
}
return list;
}
public void clear() {
queue.clear();
count.set(0);
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy