문제점 : 100 개 이상의 스레드에서 동시에 액세스 할 수있는 고정 용량 (예 : 2 개 요소)의 컬렉션을 유지 관리하십시오.FIFO 순서로 고정 용량의 스레드 안전 수집
최근 스레드의 최신 요소를 항상 저장하십시오. 일단 저장되면, 모든 요소가 중복되는지 확인하는 메소드를 작성하십시오.
내 솔루션 : 고정 용량의 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
, 당신은 첫 번째 요소가 제거지고 최근의 요소가 큐에 추가지고 있음을 분명히 알 수 있습니다.
내 질문 : 좋은 해결책입니까? 아니면 다른 좋은 해결책이 있습니까?
편집 : 자주 삭제의이 시나리오에서는는 LinkedBlockingQueue
보다 ArrayBlockingQueue
낫다?
귀하의 작업에는 컬렉션이 스레드 안전해야한다는 내용이 포함되어 있지 않습니까? 너의 것이 아니기 때문에. 쓰레드는 삽입을 막히게 될 수있다. – zapl
'''queue.size()'''를 호출하는 것은 연결된 목록 유형의 경우 O (N)입니다. 추가 할 때마다이 작업을 수행하므로 링크 된 목록의 이점을 실제로 얻지 못합니다. – Matthew
@Matthew'LinkedBlocking (De) Queue' (그리고이 코드에서 사용되는'ArrayBlockginQueue')의 O (1)은 컬렉션이 수정 될 때마다 크기를 저장하고 업데이트하기 때문입니다. 그것은 실제로 ConcurrentLinkedQueue와 몇몇 다른 것들에 대해서는 O (n)입니다. – zapl