Class HostLimitQueue
- java.lang.Object
-
- java.util.AbstractCollection<E>
-
- java.util.AbstractQueue<E>
-
- java.util.concurrent.LinkedBlockingDeque<Runnable>
-
- org.openstreetmap.josm.data.cache.HostLimitQueue
-
- All Implemented Interfaces:
Serializable
,Iterable<Runnable>
,Collection<Runnable>
,BlockingDeque<Runnable>
,BlockingQueue<Runnable>
,Deque<Runnable>
,Queue<Runnable>
public class HostLimitQueue extends LinkedBlockingDeque<Runnable>
Queue for ThreadPoolExecutor that implements per-host limit. It will acquire a semaphore for each task and it will set a runnable task with semaphore release, when job has finished.This implementation doesn't guarantee to have at most hostLimit connections per host[1], and it doesn't guarantee that all threads will be busy, when there is work for them[2].
[1] More connection per host may happen, when ThreadPoolExecutor is growing its pool, and thus tasks do not go through the Queue
[2] If we have a queue, and for all hosts in queue we will fail to acquire semaphore, the thread take the first available job and wait for semaphore. It might be the case, that semaphore was released for some task further in queue, but this implementation doesn't try to detect such situation- See Also:
- Serialized Form
-
-
Field Summary
Fields Modifier and Type Field Description private int
hostLimit
private Map<String,Semaphore>
hostSemaphores
private static long
serialVersionUID
-
Constructor Summary
Constructors Constructor Description HostLimitQueue(int hostLimit)
Creates an unbounded queueHostLimitQueue(int hostLimit, int queueLimit)
Creates bounded queue
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description private void
acquireSemaphore(Runnable job)
private JCSCachedTileLoaderJob<?,?>
findJob()
private Semaphore
getSemaphore(JCSCachedTileLoaderJob<?,?> job)
Runnable
poll(long timeout, TimeUnit unit)
private void
releaseSemaphore(JCSCachedTileLoaderJob<?,?> job)
Runnable
take()
private boolean
tryAcquireSemaphore(Runnable job, long timeout, TimeUnit unit)
private boolean
tryAcquireSemaphore(JCSCachedTileLoaderJob<?,?> job)
-
Methods inherited from class java.util.concurrent.LinkedBlockingDeque
add, addAll, addFirst, addLast, clear, contains, descendingIterator, drainTo, drainTo, element, forEach, getFirst, getLast, iterator, offer, offer, offerFirst, offerFirst, offerLast, offerLast, peek, peekFirst, peekLast, poll, pollFirst, pollFirst, pollLast, pollLast, pop, push, put, putFirst, putLast, remainingCapacity, remove, remove, removeAll, removeFirst, removeFirstOccurrence, removeIf, removeLast, removeLastOccurrence, retainAll, size, spliterator, takeFirst, takeLast, toArray, toArray, toString
-
Methods inherited from class java.util.AbstractCollection
containsAll, isEmpty
-
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
-
Methods inherited from interface java.util.Collection
containsAll, equals, hashCode, isEmpty, parallelStream, stream, toArray
-
-
-
-
Field Detail
-
serialVersionUID
private static final long serialVersionUID
- See Also:
- Constant Field Values
-
hostSemaphores
private final Map<String,Semaphore> hostSemaphores
-
hostLimit
private final int hostLimit
-
-
Constructor Detail
-
HostLimitQueue
public HostLimitQueue(int hostLimit)
Creates an unbounded queue- Parameters:
hostLimit
- how many parallel calls to host to allow
-
HostLimitQueue
public HostLimitQueue(int hostLimit, int queueLimit)
Creates bounded queue- Parameters:
hostLimit
- how many parallel calls to host to allowqueueLimit
- how deep the queue should be
-
-
Method Detail
-
findJob
private JCSCachedTileLoaderJob<?,?> findJob()
-
poll
public Runnable poll(long timeout, TimeUnit unit) throws InterruptedException
- Specified by:
poll
in interfaceBlockingDeque<Runnable>
- Specified by:
poll
in interfaceBlockingQueue<Runnable>
- Overrides:
poll
in classLinkedBlockingDeque<Runnable>
- Throws:
InterruptedException
-
take
public Runnable take() throws InterruptedException
- Specified by:
take
in interfaceBlockingDeque<Runnable>
- Specified by:
take
in interfaceBlockingQueue<Runnable>
- Overrides:
take
in classLinkedBlockingDeque<Runnable>
- Throws:
InterruptedException
-
getSemaphore
private Semaphore getSemaphore(JCSCachedTileLoaderJob<?,?> job)
-
acquireSemaphore
private void acquireSemaphore(Runnable job) throws InterruptedException
- Throws:
InterruptedException
-
tryAcquireSemaphore
private boolean tryAcquireSemaphore(JCSCachedTileLoaderJob<?,?> job)
-
tryAcquireSemaphore
private boolean tryAcquireSemaphore(Runnable job, long timeout, TimeUnit unit) throws InterruptedException
- Throws:
InterruptedException
-
releaseSemaphore
private void releaseSemaphore(JCSCachedTileLoaderJob<?,?> job)
-
-