📄 simplethreadpool.java
字号:
/* * Copyright James House (c) 2001-2004 * * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: 1. * Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. 2. Redistributions in * binary form must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */package org.quartz.simpl;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;import org.quartz.SchedulerConfigException;import org.quartz.spi.ThreadPool;/** * <p> * This is class is a simple implementation of a thread pool, based on the * <code>{@link org.quartz.spi.ThreadPool}</code> interface. * </p> * * <p> * <CODE>Runnable</CODE> objects are sent to the pool with the <code>{@link #runInThread(Runnable)}</code> * method, which blocks until a <code>Thread</code> becomes available. * </p> * * <p> * The pool has a fixed number of <code>Thread</code>s, and does not grow or * shrink based on demand. * </p> * * @author James House * @author Juergen Donnerstag */public class SimpleThreadPool implements ThreadPool { /* * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * * Data members. * * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ private int count = -1; private int prio = Thread.NORM_PRIORITY; private boolean isShutdown = false; private boolean inheritLoader = false; private boolean inheritGroup = true; private boolean makeThreadsDaemons = false; private ThreadGroup threadGroup; private Runnable nextRunnable; private Object nextRunnableLock = new Object(); private WorkerThread[] workers; private String threadNamePrefix = "SimpleThreadPoolWorker"; /* * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * * Constructors. * * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ /** * <p> * Create a new (unconfigured) <code>SimpleThreadPool</code>. * </p> * * @see #setThreadCount(int) * @see #setThreadPriority(int) */ public SimpleThreadPool() { } /** * <p> * Create a new <code>SimpleThreadPool</code> with the specified number * of <code>Thread</code> s that have the given priority. * </p> * * @param threadCount * the number of worker <code>Threads</code> in the pool, must * be > 0 and <= 200. * @param threadPriority * the thread priority for the worker threads. * * @see java.lang.Thread */ public SimpleThreadPool(int threadCount, int threadPriority) { setThreadCount(threadCount); setThreadPriority(threadPriority); } /* * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * * Interface. * * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ public Log getLog() { return LogFactory.getLog(SimpleThreadPool.class); } public int getPoolSize() { return getThreadCount(); } /** * <p> * Set the number of worker threads in the pool - has no effect after * <code>initialize()</code> has been called. * </p> */ public void setThreadCount(int count) { this.count = count; } /** * <p> * Get the number of worker threads in the pool. * </p> */ public int getThreadCount() { return count; } /** * <p> * Set the thread priority of worker threads in the pool - has no effect * after <code>initialize()</code> has been called. * </p> */ public void setThreadPriority(int prio) { this.prio = prio; } /** * <p> * Get the thread priority of worker threads in the pool. * </p> */ public int getThreadPriority() { return prio; } public void setThreadNamePrefix(String prfx) { this.threadNamePrefix = prfx; } public String getThreadNamePrefix() { return threadNamePrefix; } /** * @return Returns the * threadsInheritContextClassLoaderOfInitializingThread. */ public boolean isThreadsInheritContextClassLoaderOfInitializingThread() { return inheritLoader; } /** * @param inheritLoader * The threadsInheritContextClassLoaderOfInitializingThread to * set. */ public void setThreadsInheritContextClassLoaderOfInitializingThread( boolean inheritLoader) { this.inheritLoader = inheritLoader; } public boolean isThreadsInheritGroupOfInitializingThread() { return inheritGroup; } public void setThreadsInheritGroupOfInitializingThread( boolean inheritGroup) { this.inheritGroup = inheritGroup; } /** * @return Returns the value of makeThreadsDaemons. */ public boolean isMakeThreadsDaemons() { return makeThreadsDaemons; } /** * @param makeThreadsDaemons * The value of makeThreadsDaemons to set. */ public void setMakeThreadsDaemons(boolean makeThreadsDaemons) { this.makeThreadsDaemons = makeThreadsDaemons; } public void initialize() throws SchedulerConfigException { if (count <= 0 || count > 200) throw new SchedulerConfigException( "Thread count must be > 0 and <= 200"); if (prio <= 0 || prio > 9) throw new SchedulerConfigException( "Thread priority must be > 0 and <= 9"); if(isThreadsInheritGroupOfInitializingThread()) threadGroup = Thread.currentThread().getThreadGroup(); else { // follow the threadGroup tree to the root thread group. threadGroup = Thread.currentThread().getThreadGroup(); ThreadGroup parent = threadGroup; while ( !parent.getName().equals("main") ) { threadGroup = parent; parent = threadGroup.getParent(); } threadGroup = new ThreadGroup(parent, "SimpleThreadPool"); } if (isThreadsInheritContextClassLoaderOfInitializingThread()) getLog().info( "Job execution threads will use class loader of thread: " + Thread.currentThread().getName()); // create the worker threads and start them workers = new WorkerThread[count]; for (int i = 0; i < count; ++i) { workers[i] = new WorkerThread(this, threadGroup, getThreadNamePrefix() + "-" + i, prio, isMakeThreadsDaemons()); if (isThreadsInheritContextClassLoaderOfInitializingThread()) { workers[i].setContextClassLoader(Thread.currentThread() .getContextClassLoader()); } } } /** * <p> * Terminate any worker threads in this thread group. * </p> * * <p>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -