所以这应该是一个线程安全的队列,可以阻止任意数量的元素。验证线程代码是否正确的更多目光是值得欢迎的。
package mybq;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
public class ChunkyBlockingQueue<T> {
protected final LinkedList<T> q = new LinkedList<T>();
protected final Object lock = new Object();
public void add(T t) {
synchronized (lock) {
q.add(t);
lock.notifyAll();
}
}
public List<T> take(int numElements) {
synchronized (lock) {
while (q.size() < numElements) {
try {
lock.wait();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
ArrayList<T> l = new ArrayList<T>(numElements);
l.addAll(q.subList(0, numElements));
q.subList(0, numElements).clear();
return l;
}
}
}
应该将元素平均分配给每个消费者,还是第一个消费者对take方法获得第一个'n'元素,第二个消费者获得下一个'n'元素等? – SimonC
这真的是你想要做的吗?如果生产速度超出最终调整的速度,则可能会在数据生成和刷新到数据库之间产生几乎任意大的延迟。如果你真的需要做到这一点缓冲的所有逻辑也许应该更喜欢“等我有N个元素或者X毫秒过去了” – DRMacIver
你为什么要等待?为什么不使用'drain()'?我会将所有可用的数据写入最大值,我宁愿不丢失数据。 –