Issue #4121 - ThreadFactory support in QTP

Signed-off-by: Joakim Erdfelt <joakim.erdfelt@gmail.com>
This commit is contained in:
Joakim Erdfelt 2019-10-02 07:46:12 -05:00
parent 813fcb79ab
commit dd18c698f5
No known key found for this signature in database
GPG Key ID: 2D0E1FB8FE4B68B4
1 changed files with 18 additions and 4 deletions

View File

@ -26,6 +26,7 @@ import java.util.Set;
import java.util.concurrent.BlockingQueue; import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.RejectedExecutionException; import java.util.concurrent.RejectedExecutionException;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicLong; import java.util.concurrent.atomic.AtomicLong;
@ -45,7 +46,7 @@ import org.eclipse.jetty.util.log.Logger;
import org.eclipse.jetty.util.thread.ThreadPool.SizedThreadPool; import org.eclipse.jetty.util.thread.ThreadPool.SizedThreadPool;
@ManagedObject("A thread pool") @ManagedObject("A thread pool")
public class QueuedThreadPool extends ContainerLifeCycle implements SizedThreadPool, Dumpable, TryExecutor public class QueuedThreadPool extends ContainerLifeCycle implements ThreadFactory, SizedThreadPool, Dumpable, TryExecutor
{ {
private static final Logger LOG = Log.getLogger(QueuedThreadPool.class); private static final Logger LOG = Log.getLogger(QueuedThreadPool.class);
private static Runnable NOOP = () -> private static Runnable NOOP = () ->
@ -67,6 +68,7 @@ public class QueuedThreadPool extends ContainerLifeCycle implements SizedThreadP
private final Object _joinLock = new Object(); private final Object _joinLock = new Object();
private final BlockingQueue<Runnable> _jobs; private final BlockingQueue<Runnable> _jobs;
private final ThreadGroup _threadGroup; private final ThreadGroup _threadGroup;
private final ThreadFactory _threadFactory;
private String _name = "qtp" + hashCode(); private String _name = "qtp" + hashCode();
private int _idleTimeout; private int _idleTimeout;
private int _maxThreads; private int _maxThreads;
@ -114,7 +116,17 @@ public class QueuedThreadPool extends ContainerLifeCycle implements SizedThreadP
this(maxThreads, minThreads, idleTimeout, -1, queue, threadGroup); this(maxThreads, minThreads, idleTimeout, -1, queue, threadGroup);
} }
public QueuedThreadPool(@Name("maxThreads") int maxThreads, @Name("minThreads") int minThreads, @Name("idleTimeout") int idleTimeout, @Name("reservedThreads") int reservedThreads, @Name("queue") BlockingQueue<Runnable> queue, @Name("threadGroup") ThreadGroup threadGroup) public QueuedThreadPool(@Name("maxThreads") int maxThreads, @Name("minThreads") int minThreads,
@Name("idleTimeout") int idleTimeout, @Name("reservedThreads") int reservedThreads,
@Name("queue") BlockingQueue<Runnable> queue, @Name("threadGroup") ThreadGroup threadGroup)
{
this(maxThreads, minThreads, idleTimeout, reservedThreads, queue, threadGroup, null);
}
public QueuedThreadPool(@Name("maxThreads") int maxThreads, @Name("minThreads") int minThreads,
@Name("idleTimeout") int idleTimeout, @Name("reservedThreads") int reservedThreads,
@Name("queue") BlockingQueue<Runnable> queue, @Name("threadGroup") ThreadGroup threadGroup,
@Name("threadFactory") ThreadFactory threadFactory)
{ {
if (maxThreads < minThreads) if (maxThreads < minThreads)
throw new IllegalArgumentException("max threads (" + maxThreads + ") less than min threads (" + minThreads + ")"); throw new IllegalArgumentException("max threads (" + maxThreads + ") less than min threads (" + minThreads + ")");
@ -131,6 +143,7 @@ public class QueuedThreadPool extends ContainerLifeCycle implements SizedThreadP
_jobs = queue; _jobs = queue;
_threadGroup = threadGroup; _threadGroup = threadGroup;
setThreadPoolBudget(new ThreadPoolBudget(this)); setThreadPoolBudget(new ThreadPoolBudget(this));
_threadFactory = threadFactory == null ? this : threadFactory;
} }
@Override @Override
@ -639,7 +652,7 @@ public class QueuedThreadPool extends ContainerLifeCycle implements SizedThreadP
boolean started = false; boolean started = false;
try try
{ {
Thread thread = newThread(_runnable); Thread thread = _threadFactory.newThread(_runnable);
if (LOG.isDebugEnabled()) if (LOG.isDebugEnabled())
LOG.debug("Starting {}", thread); LOG.debug("Starting {}", thread);
_threads.add(thread); _threads.add(thread);
@ -669,7 +682,8 @@ public class QueuedThreadPool extends ContainerLifeCycle implements SizedThreadP
} }
} }
protected Thread newThread(Runnable runnable) @Override
public Thread newThread(Runnable runnable)
{ {
Thread thread = new Thread(_threadGroup, runnable); Thread thread = new Thread(_threadGroup, runnable);
thread.setDaemon(isDaemon()); thread.setDaemon(isDaemon());