所以這應該是一個線程安全的隊列,可以阻止任意數量的元素。驗證線程代碼是否正確的更多目光是值得歡迎的。
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()'?我會將所有可用的數據寫入最大值,我寧願不丟失數據。 –