첫 번째 제한은 AtomicBoolean의 맵으로 구현 될 수 있습니다. 이것은 초기화 후에 맵의 키를 변경하지 않으므로 ConcurrentHashMap 일 필요는 없습니다. 완료되면 피드 값을 false로 재설정하는 것을 잊지 마십시오.
checkAndProcessFeed(Feed feed, Map<String, AtomicBoolean> map) {
while(!map.get(feed.type).compareAndSet(false, true)) // assuming the AtomicBooleans were initialized to false
Thread.sleep(500);
}
process(feed); // at this point map.get(feed.type).get() == true
map.get(feed.type).set(false); // reset the AtomicBoolean to false
}
다른 두 제한
는 클라이언트의 수와 당 클라이언트 파일을 유지하는 데 사용,
AtomicInteger로 구현 될 수있다; 감소가 완료되면 compare-and-set을 사용하여 새 클라이언트/파일을 시작합니다.
final int maxClient = 5;
AtomicInteger clientCount = new AtomicInteger(0);
ConcurrentLinkedQueue<Client> queue = new ConcurrentLinkedQueue<>(); // hold waiting clients
while(true) {
int temp = clientCount.intValue();
if(!queue.isEmpty() && clientCount.compareAndSet(temp, temp + 1) { // thread-safe increment
process(clients.poll()); // don't forget to decrement the clientCount when the processing finishes
} else Thread.sleep(500);
}
so ... 예를 들어 파일 이름이 FEED1_CLIENT1입니까? – Eugene
옙 FEED_CLIENT_TIMESTAMP.csv –