问题:维护具有固定容量(比如2个元素)的集合,这个集合可以同时在100多个线程中访问。按先进先出顺序固定容量的线程安全收集
始终存储最近线程的最新元素。一旦他们被存储,写一个方法来检查所有这些元素是否重复。
我的解决方案:BlockingQueue
具有固定容量并实现自定义添加方法。
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.Iterator;
public class FixedBlockingQueue<T extends Object> {
final BlockingQueue<T> queue;
private int capacity;
public FixedBlockingQueue(int capacity){
super();
this.capacity = capacity;
queue = new ArrayBlockingQueue<T>(capacity);
System.out.println("Capactiy:"+this.capacity);
}
public void addElement(T element){
try{
if (queue.size() > capacity - 1){
queue.remove();
}
queue.put(element);
for (Iterator it = queue.iterator(); it.hasNext();){
System.out.println(it.next());
}
System.out.println("________");
}catch(Exception err){
err.printStackTrace();
}
}
public static void main(String args[]){
FixedBlockingQueue<Integer> f = new FixedBlockingQueue<Integer>(2);
for (int i=0; i< 10; i++){
f.addElement(i);
}
}
}
输出:
0
________
0
1
________
1
2
________
2
3
________
3
4
________
4
5
________
5
6
________
6
7
________
7
8
________
8
9
从输出,你可以清楚地看到,第一个元素是越来越删除,近期元素被添加到该队列中。
我的疑问:这是不错的解决方案吗?还是还有其他更好的解决方案,比这更好?
编辑:在频繁的缺失这种情况下,是ArrayBlockingQueue
比LinkedBlockingQueue
更好?
你的任务不包括该集合应该是线程安全吗?因为你的不是。线程可能会卡住插入,因为检查是否需要首先删除某些东西不是原子的。 – zapl
调用'''queue.size()'''对于链表类型是O(N) - 因为每次添加时都会这样做,所以你并没有真正获得链表的好处。 – Matthew
@Matthew'LinkedBlocking(De)Queue'(和'ArrayBlockginQueue'就是这个代码中使用的)的O(1),因为每当集合被修改时它们就会存储和更新大小。 ConcurrentLinkedQueue和其他的确是O(n)。 – zapl