T remove() { long id = nextThread(); Queue<T> workQueue = queuedRequests.get(id); T result = workQueue.remove(); if (workQueue.isEmpty()) { queuedRequests.remove(id); } else { activeQueuedThreads.add(id); } return result; }
void add(T element) { long threadId = Thread.currentThread().getId(); if (!activeQueuedThreads.contains(threadId)) { activeQueuedThreads.add(threadId); } queue(threadId).add(element); }
synchronized void processQueue() { while (!waitingRequests.isEmpty()) { Optional<Limiter.Listener> maybeAcquired = limiter.acquire(NO_CONTEXT); if (!maybeAcquired.isPresent()) { if (!timeoutScheduled()) { timeoutCleanup = scheduledExecutorService.schedule( this::resetLimiter, timeout.toMillis(), TimeUnit.MILLISECONDS); } return; } Limiter.Listener acquired = maybeAcquired.get(); SettableFuture<Limiter.Listener> head = waitingRequests.remove(); head.set(wrap(acquired)); } if (timeoutScheduled()) { timeoutCleanup.cancel(true); } }
synchronized ListenableFuture<Limiter.Listener> acquire() { SettableFuture<Limiter.Listener> future = SettableFuture.create(); addSlowAcquireMarker(future); waitingRequests.add(future); processQueue(); return future; }