线程池代码:  



import java.util.List;

import java.util.Vector;


 public   class  ThreadPool  
ExpandedBlockStart.gifContractedBlock.gif  {

    private static ThreadPool instance_ = null;

    //定义优先级别常数,空闲的线程按照优先级不同分别存放在三个vector中

    public static final int LOW_PRIORITY = 0;  
    public static final int NORMAL_PRIORITY = 1;

    public static final int HIGH_PRIORITY = 2;

    //保存空闲线程的List,或者说它是"池"

    private List<PooledThread>[] idleThreads_;  

    private boolean shutDown_ = false;

    private int threadCreationCounter_; //以创建的线程的个数

    private boolean debug_ = false;    //是否输出调试信息

    //构造函数,因为这个类视作为singleton实现的,因此构造函数为私有

    private ThreadPool()  
ExpandedSubBlockStart.gifContractedSubBlock.gif    {        
        // 产生空闲线程.三个vector分别存放分别处在三个优先级的线程的引用

ExpandedSubBlockStart.gifContractedSubBlock.gif        List[] idleThreads = {new Vector(5), new Vector(5), new Vector(5)};

        idleThreads_ = idleThreads;

        threadCreationCounter_ = 0;

    }

    

ExpandedSubBlockStart.gifContractedSubBlock.gif    public int getCreatedThreadsCount() {

        return threadCreationCounter_;

    }

    //通过这个函数得到线程池类的实例

ExpandedSubBlockStart.gifContractedSubBlock.gif    public static ThreadPool instance() {

        if (instance_ == null)

            instance_ = new ThreadPool();

        return instance_;

    }

    

ExpandedSubBlockStart.gifContractedSubBlock.gif    public boolean isDebug() {

        return debug_;

    }

    

    //将线程repoolingThread从新放回到池中,这个方式是同步方法。

    //这个方法会在多线程的环境中调用,设计这个方法的目的是让工作者线程

    //在执行完target中的任务后,调用池类的repool()方法,

    //将线程自身从新放回到池中。只所以这么做是因为线程池并不能预见到

    //工作者线程何时会完成任务。参考PooledThread的相关代码。

    protected synchronized void repool(PooledThread repoolingThread)

ExpandedSubBlockStart.gifContractedSubBlock.gif    {

        if (!shutDown_)  
ExpandedSubBlockStart.gifContractedSubBlock.gif        {

            if (debug_)

ExpandedSubBlockStart.gifContractedSubBlock.gif            {

                System.out.println("ThreadPool.repool() : repooling ");

            }

            switch (repoolingThread.getPriority())

ExpandedSubBlockStart.gifContractedSubBlock.gif            {

                case Thread.MIN_PRIORITY :

ExpandedSubBlockStart.gifContractedSubBlock.gif                {

                    idleThreads_[LOW_PRIORITY].add(repoolingThread);

                    break;

                }

                case Thread.NORM_PRIORITY :

ExpandedSubBlockStart.gifContractedSubBlock.gif                {

                    idleThreads_[NORMAL_PRIORITY].add(repoolingThread);

                    break;

                }

                case Thread.MAX_PRIORITY :

ExpandedSubBlockStart.gifContractedSubBlock.gif                {

                    idleThreads_[HIGH_PRIORITY].add(repoolingThread);

                    break;

                }

                default :

                    throw new IllegalStateException("Illegal priority found while repooling a Thread!");

            }

            notifyAll();//通知所有的线程

        }

        else  
ExpandedSubBlockStart.gifContractedSubBlock.gif        {

            if (debug_)

ExpandedSubBlockStart.gifContractedSubBlock.gif            {

                System.out.println("ThreadPool.repool() : Destroying incoming thread.");

            }

            repoolingThread.shutDown();//关闭线程

        }

        if (debug_)  
ExpandedSubBlockStart.gifContractedSubBlock.gif        {

            System.out.println("ThreadPool.recycle() : done.");

        }

    }

    

    public void setDebug(boolean newDebug)  
ExpandedSubBlockStart.gifContractedSubBlock.gif    {

        debug_ = newDebug;

    }

    

    //停止池中所有线程

    public synchronized void shutdown()

ExpandedSubBlockStart.gifContractedSubBlock.gif    {

        shutDown_ = true;

        if (debug_)

ExpandedSubBlockStart.gifContractedSubBlock.gif        {

            System.out.println("ThreadPool : shutting down ");

        }

        for (int prioIndex = 0; prioIndex <= HIGH_PRIORITY; prioIndex++)

ExpandedSubBlockStart.gifContractedSubBlock.gif        {

            List prioThreads = idleThreads_[prioIndex];

            for (int threadIndex = 0; threadIndex < prioThreads.size(); threadIndex++)

ExpandedSubBlockStart.gifContractedSubBlock.gif            {

                PooledThread idleThread = (PooledThread) prioThreads.get(threadIndex);

                idleThread.shutDown();

            }

        }

        notifyAll();

        if (debug_)

ExpandedSubBlockStart.gifContractedSubBlock.gif        {

            System.out.println("ThreadPool : shutdown done.");

        }

    }

    

    //以Runnable为target,从池中选择一个优先级为priority的线程创建线程

    //并让线程运行。

    public synchronized void start(Runnable target, int priority)

ExpandedSubBlockStart.gifContractedSubBlock.gif    {

        PooledThread thread = null;  //被选出来执行target的线程

        List idleList = idleThreads_[priority];

        if (idleList.size() > 0)  
ExpandedSubBlockStart.gifContractedSubBlock.gif        {

            //如果池中相应优先级的线程有空闲的,那么从中取出一个

            //设置它的target,并唤醒它

            //从空闲的线程队列中获取

            int lastIndex = idleList.size() - 1;

            thread = (PooledThread) idleList.get(lastIndex);

            idleList.remove(lastIndex);

            thread.setTarget(target);

        }

        //池中没有相应优先级的线程

        else  
ExpandedSubBlockStart.gifContractedSubBlock.gif        {  
            threadCreationCounter_++;

            // 创建新线程,

            thread = new PooledThread(target, "PooledThread #" + threadCreationCounter_, this);

            // 新线程放入池中

            switch (priority)  
ExpandedSubBlockStart.gifContractedSubBlock.gif            {

                case LOW_PRIORITY :

ExpandedSubBlockStart.gifContractedSubBlock.gif                {

                    thread.setPriority(Thread.MIN_PRIORITY);

                    break;

                }

                case NORMAL_PRIORITY :

ExpandedSubBlockStart.gifContractedSubBlock.gif                {

                    thread.setPriority(Thread.NORM_PRIORITY);

                    break;

                }

                case HIGH_PRIORITY :

ExpandedSubBlockStart.gifContractedSubBlock.gif                {

                    thread.setPriority(Thread.MAX_PRIORITY);

                    break;

                }

                default :

ExpandedSubBlockStart.gifContractedSubBlock.gif                {

                    thread.setPriority(Thread.NORM_PRIORITY);

                    break;

                }

            }

            //启动这个线程

            thread.start();

        }

    }

}


工作者线程代码:


public   class  PooledThread extends Thread  
ExpandedBlockStart.gifContractedBlock.gif  {

    private ThreadPool pool_;  // 池中线程需要知道自己所在的池

    private Runnable target_;   // 线程的任务

    private boolean shutDown_ = false;

    private boolean idle_ = false;//设置是否让线程处于等待状态

    

ExpandedSubBlockStart.gifContractedSubBlock.gif    private PooledThread() {

        super();

    }

    

    private PooledThread(Runnable target)

ExpandedSubBlockStart.gifContractedSubBlock.gif    {

        super(target); //初始化父类

    }

    

    private PooledThread(Runnable target, String name)  
ExpandedSubBlockStart.gifContractedSubBlock.gif    {

        super(target, name);

    }

    

    public PooledThread(Runnable target, String name, ThreadPool pool)

ExpandedSubBlockStart.gifContractedSubBlock.gif    {

        super(name);

        pool_ = pool;

        target_ = target;

    }

    

    private PooledThread(String name)  
ExpandedSubBlockStart.gifContractedSubBlock.gif    {

        super(name);//初始化父类

    }

    

    private PooledThread(ThreadGroup group, Runnable target)

ExpandedSubBlockStart.gifContractedSubBlock.gif    {

        super(group, target);

    }

    

    private PooledThread(ThreadGroup group, Runnable target, String name)  
ExpandedSubBlockStart.gifContractedSubBlock.gif    {

        super(group, target, name);

    }

    

    private PooledThread(ThreadGroup group, String name)  
ExpandedSubBlockStart.gifContractedSubBlock.gif    {

        super(group, name);

    }

    

    public java.lang.Runnable getTarget()  
ExpandedSubBlockStart.gifContractedSubBlock.gif    {

        return target_;

    }

    

    public boolean isIdle()  
ExpandedSubBlockStart.gifContractedSubBlock.gif    {

        return idle_;//返回当前的状态

    }

    

    //工作者线程与通常线程不同之处在于run()方法的不同。通常的线程,

    //完成线程应该执行的代码后,自然退出,线程结束。

    //虚拟机在线程结束后收回分配给线程的资源,线程对象被垃圾回收。]

    //而这在池化的工作者线程中是应该避免的,否则线程池就失去了意义。

    //作为可以被放入池中并重新利用的工作者线程,它的run()方法不应该结束,

    //随意,在随后可以看到的实现中,run()方法执行完target对象的代码后,

    //就将自身repool(),然后调用wait()方法,使自己睡眠而不是退出循环和run()。

    //这就使线程池实现的要点。

    public void run()  
ExpandedSubBlockStart.gifContractedSubBlock.gif    {

        // 这个循环不能结束,除非池类要求线程结束

        // 每一次循环都会执行一次池类分配给的任务target

        while (!shutDown_)  
ExpandedSubBlockStart.gifContractedSubBlock.gif        {  

            idle_ = false;

            if (target_ != null)  
ExpandedSubBlockStart.gifContractedSubBlock.gif            {

                target_.run();  // 运行target中的代码

            }

            idle_ = true;

            try  
ExpandedSubBlockStart.gifContractedSubBlock.gif            {

                //线程通知池重新将自己放回到池中

                pool_.repool(this);  //  
                //进入池中后睡眠,等待被唤醒执行新的任务,

                //这里是线程池中线程于普通线程的run()不同的地方。

                synchronized (this)  
ExpandedSubBlockStart.gifContractedSubBlock.gif                {

                    wait();

                }

            }

            catch (InterruptedException ie)

ExpandedSubBlockStart.gifContractedSubBlock.gif            {

            }

            idle_ = false;

        }

        //循环这里不能结束,否则线程结束,资源被VM收回,

        //就无法起到线程池的作用了

    }

    

    

    public synchronized void setTarget(java.lang.Runnable newTarget)  
ExpandedSubBlockStart.gifContractedSubBlock.gif    {//设置新的target,并唤醒睡眠中的线程

        target_ = newTarget;  // 新任务

        notifyAll();          // 唤醒睡眠的线程

    }

    

    public synchronized void shutDown()

ExpandedSubBlockStart.gifContractedSubBlock.gif    {

        shutDown_ = true;

        notifyAll();

    }

}



测试代码:


public   static   void  main(String[] args)

ExpandedBlockStart.gifContractedBlock.gif      {

        System.out.println("Testing ThreadPool ");

        System.out.println("Creating ThreadPool ");

        ThreadPool pool = ThreadPool.instance();

        pool.setDebug(true);

        class TestRunner implements Runnable  
ExpandedSubBlockStart.gifContractedSubBlock.gif        {

            public int count = 0;

            public void run()  
ExpandedSubBlockStart.gifContractedSubBlock.gif            {

                System.out.println("Testrunner sleeping 5 seconds ");

                //此方法使本线程睡眠5秒

                synchronized (this)  
ExpandedSubBlockStart.gifContractedSubBlock.gif                {

                    try  
ExpandedSubBlockStart.gifContractedSubBlock.gif                    {

                        wait(5000);//等待5秒时间

                    }

                    catch (InterruptedException ioe)  
ExpandedSubBlockStart.gifContractedSubBlock.gif                    {

                    }

                }

                System.out.println("Testrunner leaving  ");

                count++;

            }

        }

        System.out.println("Starting a new thread ");

        TestRunner runner = new TestRunner();

        pool.start(runner, pool.HIGH_PRIORITY);

        System.out.println("count : " + runner.count);

        System.out.println("Thread count : " + pool.getCreatedThreadsCount());

        pool.shutdown();

    }

}


测试结果:


Testing ThreadPool  

Creating ThreadPool  

Starting a new thread  

Testrunner sleeping  5  seconds  

count :  0

Thread count :  1

ThreadPool : shutting down  

ThreadPool : shutdown done .

Testrunner leaving    
ThreadPool . repool ()  : Destroying incoming thread .

ThreadPool . recycle ()  : done