⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 threadpool.java

📁 这是一个法律事务所系统源码
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
/* * $Header: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/util/Attic/ThreadPool.java,v 1.9.2.1 2000/07/06 22:20:17 alex Exp $ * $Revision: 1.9.2.1 $ * $Date: 2000/07/06 22:20:17 $ * * ==================================================================== * * The Apache Software License, Version 1.1 * * Copyright (c) 1999 The Apache Software Foundation.  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. * * 3. The end-user documentation included with the redistribution, if *    any, must include the following acknowlegement: *       "This product includes software developed by the *        Apache Software Foundation (http://www.apache.org/)." *    Alternately, this acknowlegement may appear in the software itself, *    if and wherever such third-party acknowlegements normally appear. * * 4. The names "The Jakarta Project", "Tomcat", and "Apache Software *    Foundation" must not be used to endorse or promote products derived *    from this software without prior written permission. For written *    permission, please contact apache@apache.org. * * 5. Products derived from this software may not be called "Apache" *    nor may "Apache" appear in their names without prior written *    permission of the Apache Group. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 APACHE SOFTWARE FOUNDATION OR * ITS 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. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation.  For more * information on the Apache Software Foundation, please see * <http://www.apache.org/>. * * [Additional notices, if required by prior licensing conditions] * */package org.apache.tomcat.util;import java.util.zip.*;import java.net.*;import java.util.*;import java.io.*;import org.apache.tomcat.logging.*; /** * A thread pool that is trying to copy the apache process management. * * @author Gal Shachor */public class ThreadPool  {    /*     * Default values ...     */    public static final int MAX_THREADS = 100;    public static final int MAX_SPARE_THREADS = 50;    public static final int MIN_SPARE_THREADS = 10;    public static final int WORK_WAIT_TIMEOUT = 60*1000;    /*     * Where the threads are held.     */    protected Vector pool;    /*     * A monitor thread that monitors the pool for idel threads.     */    protected MonitorRunnable monitor;    /*     * Max number of threads that you can open in the pool.     */    protected int maxThreads;    /*     * Min number of idel threads that you can leave in the pool.     */    protected int minSpareThreads;    /*     * Max number of idel threads that you can leave in the pool.     */    protected int maxSpareThreads;    /*     * Number of threads in the pool.     */    protected int currentThreadCount;    /*     * Number of busy threads in the pool.     */    protected int currentThreadsBusy;    /*     * Flag that the pool should terminate all the threads and stop.     */    protected boolean stopThePool;    static int debug=0;    /**     * Helper object for logging     **/    LogHelper loghelper = new LogHelper("tc_log", "ThreadPool");        public ThreadPool() {        maxThreads      = MAX_THREADS;        maxSpareThreads = MAX_SPARE_THREADS;        minSpareThreads = MIN_SPARE_THREADS;        currentThreadCount  = 0;        currentThreadsBusy  = 0;        stopThePool = false;    }    public synchronized void start() {        adjustLimits();        openThreads(minSpareThreads);        monitor = new MonitorRunnable(this);    }    public void setMaxThreads(int maxThreads) {        this.maxThreads = maxThreads;    }    public int getMaxThreads() {        return maxThreads;    }    public void setMinSpareThreads(int minSpareThreads) {        this.minSpareThreads = minSpareThreads;    }    public int getMinSpareThreads() {        return minSpareThreads;    }    public void setMaxSpareThreads(int maxSpareThreads) {        this.maxSpareThreads = maxSpareThreads;    }    public int getMaxSpareThreads() {        return maxSpareThreads;    }    //    // You may wonder what you see here ... basically I am trying    // to maintain a stack of threads. This way locality in time    // is kept and there is a better chance to find residues of the    // thread in memory next time it runs.    //    /**     * Executes a given Runnable on a thread in the pool, block if needed.     */    public void runIt(ThreadPoolRunnable r) {        if(null == r) {            throw new NullPointerException();        }        if(0 == currentThreadCount || stopThePool) {            throw new IllegalStateException();        }        ControlRunnable c = null;        // Obtain a free thread from the pool.        synchronized(this) {            if(currentThreadsBusy == currentThreadCount) {                 // All threads are busy                if(currentThreadCount < maxThreads) {                    // Not all threads were open,                    // Open new threads up to the max number of idel threads                    int toOpen = currentThreadCount + minSpareThreads;                    openThreads(toOpen);                } else {                    // Wait for a thread to become idel.                    while(currentThreadsBusy == currentThreadCount) {                        try {                            this.wait();                        }			// was just catch Throwable -- but no other			// exceptions can be thrown by wait, right?			// So we catch and ignore this one, since			// it'll never actually happen, since nowhere			// do we say pool.interrupt().			catch(InterruptedException e) {			    loghelper.log("Unexpected exception", e);                        }                        // Pool was stopped. Get away of the pool.                        if(0 == currentThreadCount || stopThePool) {                            throw new IllegalStateException();                        }                    }                }            }            // If we are here it means that there is a free thred. Take it.            c = (ControlRunnable)pool.lastElement();            pool.removeElement(c);            currentThreadsBusy++;        }        c.runIt(r);    }    /**     * Stop the thread pool     */    public synchronized void shutdown() {        if(!stopThePool) {            stopThePool = true;            monitor.terminate();            monitor = null;            for(int i = 0 ; i < (currentThreadCount - currentThreadsBusy) ; i++) {                try {                    ((ControlRunnable)(pool.elementAt(i))).terminate();                } catch(Throwable t) {                    /* 					 * Do nothing... The show must go on, we are shutting 					 * down the pool and nothing should stop that.					 */		    loghelper.log("Ignored exception while shutting down thread pool", t, Logger.ERROR);                }            }            currentThreadsBusy = currentThreadCount = 0;            pool = null;            notifyAll();        }    }    /**     * Called by the monitor thread to harvest idel threads.     */    protected synchronized void checkSpareControllers() {        if(stopThePool) {            return;        }        if((currentThreadCount - currentThreadsBusy) > maxSpareThreads) {            int toFree = currentThreadCount -                         currentThreadsBusy -                         maxSpareThreads;            for(int i = 0 ; i < toFree ; i++) {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -