Package org.eclipse.jetty.util.thread
Class QueuedThreadPool
- java.lang.Object
-
- org.eclipse.jetty.util.component.AbstractLifeCycle
-
- org.eclipse.jetty.util.component.ContainerLifeCycle
-
- org.eclipse.jetty.util.thread.QueuedThreadPool
-
- All Implemented Interfaces:
java.util.concurrent.Executor
,java.util.concurrent.ThreadFactory
,Container
,Destroyable
,Dumpable
,Dumpable.DumpableContainer
,LifeCycle
,ThreadPool
,ThreadPool.SizedThreadPool
,TryExecutor
- Direct Known Subclasses:
MonitoredQueuedThreadPool
@ManagedObject("A thread pool") public class QueuedThreadPool extends ContainerLifeCycle implements java.util.concurrent.ThreadFactory, ThreadPool.SizedThreadPool, Dumpable, TryExecutor
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description private class
QueuedThreadPool.Runner
-
Nested classes/interfaces inherited from class org.eclipse.jetty.util.component.AbstractLifeCycle
AbstractLifeCycle.AbstractLifeCycleListener
-
Nested classes/interfaces inherited from interface org.eclipse.jetty.util.component.Container
Container.InheritedListener, Container.Listener
-
Nested classes/interfaces inherited from interface org.eclipse.jetty.util.component.Dumpable
Dumpable.DumpableContainer
-
Nested classes/interfaces inherited from interface org.eclipse.jetty.util.component.LifeCycle
LifeCycle.Listener
-
Nested classes/interfaces inherited from interface org.eclipse.jetty.util.thread.ThreadPool
ThreadPool.SizedThreadPool
-
Nested classes/interfaces inherited from interface org.eclipse.jetty.util.thread.TryExecutor
TryExecutor.NoTryExecutor
-
-
Field Summary
Fields Modifier and Type Field Description private ThreadPoolBudget
_budget
private AtomicBiInteger
_counts
Encodes thread counts: HiTotal thread count or Integer.MIN_VALUE if the pool is stopping LoNet idle threads == idle threads - job queue size.private boolean
_daemon
private boolean
_detailedDump
private int
_idleTimeout
private java.util.concurrent.BlockingQueue<java.lang.Runnable>
_jobs
private java.lang.Object
_joinLock
private java.util.concurrent.atomic.AtomicLong
_lastShrink
private int
_lowThreadsThreshold
private int
_maxThreads
private int
_minThreads
private java.lang.String
_name
private int
_priority
private int
_reservedThreads
private java.lang.Runnable
_runnable
private java.util.concurrent.ThreadFactory
_threadFactory
private java.lang.ThreadGroup
_threadGroup
private java.util.Set<java.lang.Thread>
_threads
private TryExecutor
_tryExecutor
private static Logger
LOG
private static java.lang.Runnable
NOOP
-
Fields inherited from class org.eclipse.jetty.util.component.AbstractLifeCycle
FAILED, RUNNING, STARTED, STARTING, STOPPED, STOPPING
-
Fields inherited from interface org.eclipse.jetty.util.thread.TryExecutor
NO_TRY
-
-
Constructor Summary
Constructors Constructor Description QueuedThreadPool()
QueuedThreadPool(int maxThreads)
QueuedThreadPool(int maxThreads, int minThreads)
QueuedThreadPool(int maxThreads, int minThreads, int idleTimeout)
QueuedThreadPool(int maxThreads, int minThreads, int idleTimeout, int reservedThreads, java.util.concurrent.BlockingQueue<java.lang.Runnable> queue, java.lang.ThreadGroup threadGroup)
QueuedThreadPool(int maxThreads, int minThreads, int idleTimeout, int reservedThreads, java.util.concurrent.BlockingQueue<java.lang.Runnable> queue, java.lang.ThreadGroup threadGroup, java.util.concurrent.ThreadFactory threadFactory)
QueuedThreadPool(int maxThreads, int minThreads, int idleTimeout, java.util.concurrent.BlockingQueue<java.lang.Runnable> queue)
QueuedThreadPool(int maxThreads, int minThreads, int idleTimeout, java.util.concurrent.BlockingQueue<java.lang.Runnable> queue, java.lang.ThreadGroup threadGroup)
QueuedThreadPool(int maxThreads, int minThreads, java.util.concurrent.BlockingQueue<java.lang.Runnable> queue)
-
Method Summary
All Methods Instance Methods Concrete Methods Deprecated Methods Modifier and Type Method Description private boolean
addCounts(int deltaThreads, int deltaIdle)
protected void
doStart()
Starts the managed lifecycle beans in the order they were added.protected void
doStop()
Stops the managed lifecycle beans in the reverse order they were added.void
dump(java.lang.Appendable out, java.lang.String indent)
Dump this object (and children) into an Appendable using the provided indent after any new lines.java.lang.String
dumpThread(long id)
private void
ensureThreads()
void
execute(java.lang.Runnable job)
int
getBusyThreads()
int
getIdleThreads()
int
getIdleTimeout()
Get the maximum thread idle time.int
getLowThreadsThreshold()
int
getMaxThreads()
Get the maximum number of threads.int
getMinThreads()
Get the minimum number of threads.java.lang.String
getName()
protected java.util.concurrent.BlockingQueue<java.lang.Runnable>
getQueue()
int
getQueueSize()
Get the size of the job queue.int
getReservedThreads()
Get the number of reserved threads.ThreadPoolBudget
getThreadPoolBudget()
int
getThreads()
int
getThreadsPriority()
Get the priority of the pool threads.boolean
interruptThread(long id)
boolean
isDaemon()
boolean
isDetailedDump()
boolean
isLowOnThreads()
Returns whether this thread pool is low on threads.void
join()
Blocks until the thread pool isstopped
.private void
joinThreads(long stopByNanos)
java.lang.Thread
newThread(java.lang.Runnable runnable)
protected void
removeThread(java.lang.Thread thread)
protected void
runJob(java.lang.Runnable job)
Runs the given job in thecurrent thread
.void
setDaemon(boolean daemon)
Thread Pool should use Daemon Threading.void
setDetailedDump(boolean detailedDump)
void
setIdleTimeout(int idleTimeout)
Set the maximum thread idle time.void
setLowThreadsThreshold(int lowThreadsThreshold)
void
setMaxThreads(int maxThreads)
Set the maximum number of threads.void
setMinThreads(int minThreads)
Set the minimum number of threads.void
setName(java.lang.String name)
void
setQueue(java.util.concurrent.BlockingQueue<java.lang.Runnable> queue)
Deprecated.pass the queue to the constructor insteadvoid
setReservedThreads(int reservedThreads)
Set the number of reserved threads.void
setThreadPoolBudget(ThreadPoolBudget budget)
void
setThreadsPriority(int priority)
Set the priority of the pool threads.protected void
startThread()
java.lang.String
toString()
boolean
tryExecute(java.lang.Runnable task)
Attempt to execute a task.-
Methods inherited from class org.eclipse.jetty.util.component.ContainerLifeCycle
addBean, addBean, addEventListener, addManaged, contains, destroy, dump, dump, dump, dump, dumpBeans, dumpObject, dumpObjects, dumpStdErr, dumpThis, getBean, getBeans, getBeans, getContainedBeans, getContainedBeans, isAuto, isManaged, isUnmanaged, manage, removeBean, removeBeans, removeEventListener, setBeans, setStopTimeout, start, stop, unmanage, updateBean, updateBean, updateBeans
-
Methods inherited from class org.eclipse.jetty.util.component.AbstractLifeCycle
addLifeCycleListener, getState, getState, getStopTimeout, isFailed, isRunning, isStarted, isStarting, isStopped, isStopping, removeLifeCycleListener, start, stop
-
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
-
Methods inherited from interface org.eclipse.jetty.util.component.Dumpable.DumpableContainer
isDumpable
-
-
-
-
Field Detail
-
LOG
private static final Logger LOG
-
NOOP
private static java.lang.Runnable NOOP
-
_counts
private final AtomicBiInteger _counts
Encodes thread counts:- Hi
- Total thread count or Integer.MIN_VALUE if the pool is stopping
- Lo
- Net idle threads == idle threads - job queue size. Essentially if positive, this represents the effective number of idle threads, and if negative it represents the demand for more threads
-
_lastShrink
private final java.util.concurrent.atomic.AtomicLong _lastShrink
-
_threads
private final java.util.Set<java.lang.Thread> _threads
-
_joinLock
private final java.lang.Object _joinLock
-
_jobs
private final java.util.concurrent.BlockingQueue<java.lang.Runnable> _jobs
-
_threadGroup
private final java.lang.ThreadGroup _threadGroup
-
_threadFactory
private final java.util.concurrent.ThreadFactory _threadFactory
-
_name
private java.lang.String _name
-
_idleTimeout
private int _idleTimeout
-
_maxThreads
private int _maxThreads
-
_minThreads
private int _minThreads
-
_reservedThreads
private int _reservedThreads
-
_tryExecutor
private TryExecutor _tryExecutor
-
_priority
private int _priority
-
_daemon
private boolean _daemon
-
_detailedDump
private boolean _detailedDump
-
_lowThreadsThreshold
private int _lowThreadsThreshold
-
_budget
private ThreadPoolBudget _budget
-
_runnable
private final java.lang.Runnable _runnable
-
-
Constructor Detail
-
QueuedThreadPool
public QueuedThreadPool()
-
QueuedThreadPool
public QueuedThreadPool(@Name("maxThreads") int maxThreads)
-
QueuedThreadPool
public QueuedThreadPool(@Name("maxThreads") int maxThreads, @Name("minThreads") int minThreads)
-
QueuedThreadPool
public QueuedThreadPool(@Name("maxThreads") int maxThreads, @Name("minThreads") int minThreads, @Name("queue") java.util.concurrent.BlockingQueue<java.lang.Runnable> queue)
-
QueuedThreadPool
public QueuedThreadPool(@Name("maxThreads") int maxThreads, @Name("minThreads") int minThreads, @Name("idleTimeout") int idleTimeout)
-
QueuedThreadPool
public QueuedThreadPool(@Name("maxThreads") int maxThreads, @Name("minThreads") int minThreads, @Name("idleTimeout") int idleTimeout, @Name("queue") java.util.concurrent.BlockingQueue<java.lang.Runnable> queue)
-
QueuedThreadPool
public QueuedThreadPool(@Name("maxThreads") int maxThreads, @Name("minThreads") int minThreads, @Name("idleTimeout") int idleTimeout, @Name("queue") java.util.concurrent.BlockingQueue<java.lang.Runnable> queue, @Name("threadGroup") java.lang.ThreadGroup threadGroup)
-
QueuedThreadPool
public QueuedThreadPool(@Name("maxThreads") int maxThreads, @Name("minThreads") int minThreads, @Name("idleTimeout") int idleTimeout, @Name("reservedThreads") int reservedThreads, @Name("queue") java.util.concurrent.BlockingQueue<java.lang.Runnable> queue, @Name("threadGroup") java.lang.ThreadGroup threadGroup)
-
QueuedThreadPool
public QueuedThreadPool(@Name("maxThreads") int maxThreads, @Name("minThreads") int minThreads, @Name("idleTimeout") int idleTimeout, @Name("reservedThreads") int reservedThreads, @Name("queue") java.util.concurrent.BlockingQueue<java.lang.Runnable> queue, @Name("threadGroup") java.lang.ThreadGroup threadGroup, @Name("threadFactory") java.util.concurrent.ThreadFactory threadFactory)
-
-
Method Detail
-
getThreadPoolBudget
public ThreadPoolBudget getThreadPoolBudget()
- Specified by:
getThreadPoolBudget
in interfaceThreadPool.SizedThreadPool
- Returns:
- a ThreadPoolBudget for this sized thread pool, or null of no ThreadPoolBudget can be returned
-
setThreadPoolBudget
public void setThreadPoolBudget(ThreadPoolBudget budget)
-
doStart
protected void doStart() throws java.lang.Exception
Description copied from class:ContainerLifeCycle
Starts the managed lifecycle beans in the order they were added.- Overrides:
doStart
in classContainerLifeCycle
- Throws:
java.lang.Exception
-
doStop
protected void doStop() throws java.lang.Exception
Description copied from class:ContainerLifeCycle
Stops the managed lifecycle beans in the reverse order they were added.- Overrides:
doStop
in classContainerLifeCycle
- Throws:
java.lang.Exception
-
joinThreads
private void joinThreads(long stopByNanos) throws java.lang.InterruptedException
- Throws:
java.lang.InterruptedException
-
setDaemon
public void setDaemon(boolean daemon)
Thread Pool should use Daemon Threading.- Parameters:
daemon
- true to enable delegation- See Also:
Thread.setDaemon(boolean)
-
setIdleTimeout
public void setIdleTimeout(int idleTimeout)
Set the maximum thread idle time. Threads that are idle for longer than this period may be stopped.- Parameters:
idleTimeout
- Max idle time in ms.- See Also:
getIdleTimeout()
-
setMaxThreads
public void setMaxThreads(int maxThreads)
Set the maximum number of threads.- Specified by:
setMaxThreads
in interfaceThreadPool.SizedThreadPool
- Parameters:
maxThreads
- maximum number of threads.- See Also:
getMaxThreads()
-
setMinThreads
public void setMinThreads(int minThreads)
Set the minimum number of threads.- Specified by:
setMinThreads
in interfaceThreadPool.SizedThreadPool
- Parameters:
minThreads
- minimum number of threads- See Also:
getMinThreads()
-
setReservedThreads
public void setReservedThreads(int reservedThreads)
Set the number of reserved threads.- Parameters:
reservedThreads
- number of reserved threads or -1 for heuristically determined- See Also:
getReservedThreads()
-
setName
public void setName(java.lang.String name)
- Parameters:
name
- Name of this thread pool to use when naming threads.
-
setThreadsPriority
public void setThreadsPriority(int priority)
Set the priority of the pool threads.- Parameters:
priority
- the new thread priority.
-
getIdleTimeout
@ManagedAttribute("maximum time a thread may be idle in ms") public int getIdleTimeout()
Get the maximum thread idle time.- Returns:
- Max idle time in ms.
- See Also:
setIdleTimeout(int)
-
getMaxThreads
@ManagedAttribute("maximum number of threads in the pool") public int getMaxThreads()
Get the maximum number of threads.- Specified by:
getMaxThreads
in interfaceThreadPool.SizedThreadPool
- Returns:
- maximum number of threads.
- See Also:
setMaxThreads(int)
-
getMinThreads
@ManagedAttribute("minimum number of threads in the pool") public int getMinThreads()
Get the minimum number of threads.- Specified by:
getMinThreads
in interfaceThreadPool.SizedThreadPool
- Returns:
- minimum number of threads.
- See Also:
setMinThreads(int)
-
getReservedThreads
@ManagedAttribute("the number of reserved threads in the pool") public int getReservedThreads()
Get the number of reserved threads.- Returns:
- number of reserved threads or or -1 for heuristically determined
- See Also:
setReservedThreads(int)
-
getName
@ManagedAttribute("name of the thread pool") public java.lang.String getName()
- Returns:
- The name of the this thread pool
-
getThreadsPriority
@ManagedAttribute("priority of threads in the pool") public int getThreadsPriority()
Get the priority of the pool threads.- Returns:
- the priority of the pool threads.
-
getQueueSize
@ManagedAttribute("size of the job queue") public int getQueueSize()
Get the size of the job queue.- Returns:
- Number of jobs queued waiting for a thread
-
isDaemon
@ManagedAttribute("thread pool uses daemon threads") public boolean isDaemon()
- Returns:
- whether this thread pool is using daemon threads
- See Also:
Thread.setDaemon(boolean)
-
isDetailedDump
@ManagedAttribute("reports additional details in the dump") public boolean isDetailedDump()
-
setDetailedDump
public void setDetailedDump(boolean detailedDump)
-
getLowThreadsThreshold
@ManagedAttribute("threshold at which the pool is low on threads") public int getLowThreadsThreshold()
-
setLowThreadsThreshold
public void setLowThreadsThreshold(int lowThreadsThreshold)
-
execute
public void execute(java.lang.Runnable job)
- Specified by:
execute
in interfacejava.util.concurrent.Executor
- Specified by:
execute
in interfaceTryExecutor
-
tryExecute
public boolean tryExecute(java.lang.Runnable task)
Description copied from interface:TryExecutor
Attempt to execute a task.- Specified by:
tryExecute
in interfaceTryExecutor
- Parameters:
task
- The task to be executed- Returns:
- True IFF the task has been given directly to a thread to execute. The task cannot be queued pending the later availability of a Thread.
-
join
public void join() throws java.lang.InterruptedException
Blocks until the thread pool isstopped
.- Specified by:
join
in interfaceThreadPool
- Throws:
java.lang.InterruptedException
- if thread was interrupted
-
getThreads
@ManagedAttribute("number of threads in the pool") public int getThreads()
- Specified by:
getThreads
in interfaceThreadPool
- Returns:
- the total number of threads currently in the pool
-
getIdleThreads
@ManagedAttribute("number of idle threads in the pool") public int getIdleThreads()
- Specified by:
getIdleThreads
in interfaceThreadPool
- Returns:
- the number of idle threads in the pool
-
getBusyThreads
@ManagedAttribute("number of busy threads in the pool") public int getBusyThreads()
- Returns:
- the number of busy threads in the pool
-
isLowOnThreads
@ManagedAttribute(value="thread pool is low on threads", readonly=true) public boolean isLowOnThreads()
Returns whether this thread pool is low on threads.
The current formula is:
maxThreads - threads + idleThreads - queueSize <= lowThreadsThreshold
- Specified by:
isLowOnThreads
in interfaceThreadPool
- Returns:
- whether the pool is low on threads
- See Also:
getLowThreadsThreshold()
-
ensureThreads
private void ensureThreads()
-
startThread
protected void startThread()
-
addCounts
private boolean addCounts(int deltaThreads, int deltaIdle)
-
newThread
public java.lang.Thread newThread(java.lang.Runnable runnable)
- Specified by:
newThread
in interfacejava.util.concurrent.ThreadFactory
-
removeThread
protected void removeThread(java.lang.Thread thread)
-
dump
public void dump(java.lang.Appendable out, java.lang.String indent) throws java.io.IOException
Description copied from interface:Dumpable
Dump this object (and children) into an Appendable using the provided indent after any new lines. The indent should not be applied to the first object dumped.- Specified by:
dump
in interfaceDumpable
- Overrides:
dump
in classContainerLifeCycle
- Parameters:
out
- The appendable to dump toindent
- The indent to apply after any new lines.- Throws:
java.io.IOException
- if unable to write to Appendable
-
toString
public java.lang.String toString()
- Overrides:
toString
in classAbstractLifeCycle
-
runJob
protected void runJob(java.lang.Runnable job)
Runs the given job in the
current thread
.Subclasses may override to perform pre/post actions before/after the job is run.
- Parameters:
job
- the job to run
-
getQueue
protected java.util.concurrent.BlockingQueue<java.lang.Runnable> getQueue()
- Returns:
- the job queue
-
setQueue
@Deprecated public void setQueue(java.util.concurrent.BlockingQueue<java.lang.Runnable> queue)
Deprecated.pass the queue to the constructor instead- Parameters:
queue
- the job queue
-
interruptThread
@ManagedOperation("interrupts a pool thread") public boolean interruptThread(@Name("id") long id)
- Parameters:
id
- the thread ID to interrupt.- Returns:
- true if the thread was found and interrupted.
-
dumpThread
@ManagedOperation("dumps a pool thread stack") public java.lang.String dumpThread(@Name("id") long id)
- Parameters:
id
- the thread ID to interrupt.- Returns:
- the stack frames dump
-
-