Package com.spotify.futures
Class ConcurrencyLimiter<T>
java.lang.Object
com.spotify.futures.ConcurrencyLimiter<T>
- All Implemented Interfaces:
FutureJobInvoker<T>
A ConcurrencyLimiter can be used for efficiently queueing up asynchronous work to only run up to
a specific limit of work concurrently.
This is a threadsafe class.
-
Nested Class Summary
Nested ClassesModifier and TypeClassDescriptionstatic classprivate static class -
Field Summary
FieldsModifier and TypeFieldDescriptionprivate final Executorprivate final Semaphoreprivate final intprivate final intprivate final BlockingQueue<ConcurrencyLimiter.Job<T>> -
Constructor Summary
ConstructorsModifierConstructorDescriptionprivateConcurrencyLimiter(Executor executor, int maxConcurrency, int maxQueueSize) -
Method Summary
Modifier and TypeMethodDescriptioncom.google.common.util.concurrent.ListenableFuture<T>the callable function will run as soon as the currently active set of futures is less than the maxConcurrency limit.static <T> ConcurrencyLimiter<T>create(int maxConcurrency, int maxQueueSize) Create aConcurrencyLimiterinstance.static <T> ConcurrencyLimiter<T>Create aConcurrencyLimiterinstance.private ConcurrencyLimiter.Job<T>grabJob()Return aJobwith acquired permit,nullotherwise.private voidinvoke(com.google.common.util.concurrent.SettableFuture<T> response, Callable<? extends com.google.common.util.concurrent.ListenableFuture<T>> callable) intReturn the number of currently active futures that have not yet completed.intReturn the number of callables that are queued up and haven't started yet.private voidpump()intReturn the number of additional callables that can be run without queueing.intReturn the number of additional callables that can be queued before failing.
-
Field Details
-
executor
-
queue
-
limit
-
maxQueueSize
private final int maxQueueSize -
maxConcurrency
private final int maxConcurrency
-
-
Constructor Details
-
ConcurrencyLimiter
-
-
Method Details
-
create
Create aConcurrencyLimiterinstance.- Parameters:
maxConcurrency- maximum number of futures in progress,maxQueueSize- maximum number of jobs in queue. This is a soft bound and may be temporarily exceeded if add() is called concurrently.- Returns:
- a new concurrency limiter
-
create
public static <T> ConcurrencyLimiter<T> create(Executor executor, int maxConcurrency, int maxQueueSize) Create aConcurrencyLimiterinstance.- Parameters:
executor- the executor to run callables on.maxConcurrency- maximum number of futures in progress,maxQueueSize- maximum number of jobs in queue. This is a soft bound and may be temporarily exceeded if add() is called concurrently.- Returns:
- a new concurrency limiter
-
add
public com.google.common.util.concurrent.ListenableFuture<T> add(Callable<? extends com.google.common.util.concurrent.ListenableFuture<T>> callable) the callable function will run as soon as the currently active set of futures is less than the maxConcurrency limit.- Specified by:
addin interfaceFutureJobInvoker<T>- Parameters:
callable- - a function that creates a future.- Returns:
- a proxy future that completes with the future created by the input function. This
future will be immediately failed with
ConcurrencyLimiter.CapacityReachedExceptionif the soft queue size limit is exceeded. - Throws:
NullPointerException- if callable is null
-
numQueued
public int numQueued()Return the number of callables that are queued up and haven't started yet.- Returns:
- the number of callables that are queued up and haven't started yet.
-
numActive
public int numActive()Return the number of currently active futures that have not yet completed.- Returns:
- the number of currently active futures that have not yet completed.
-
remainingQueueCapacity
public int remainingQueueCapacity()Return the number of additional callables that can be queued before failing.- Returns:
- the number of additional callables that can be queued before failing.
-
remainingActiveCapacity
public int remainingActiveCapacity()Return the number of additional callables that can be run without queueing.- Returns:
- the number of additional callables that can be run without queueing.
-
grabJob
Return aJobwith acquired permit,nullotherwise.Does one of two things: 1) return a job and acquire a permit from the semaphore 2) return null and does not acquire a permit from the semaphore
-
pump
private void pump() -
invoke
-