JSpider学习五 —— WorkerThreadPool

    之前提到SpiderImpl的两个重要成员spiders和thinkers,他们都是WorkerThreadPool类的实例,下面分析这个类的代码。

    该类继承了java.lang.ThreadGroup类,有三个成员:

    /** Task Dispatcher thread associated with this threadpool. */
    protected DispatcherThread dispatcherThread; // 为这个线程池分派任务的线程;

    /** Array of threads in the pool. */
    protected WorkerThread[] pool; // 工作线程池


    /** Size of the pool. */
    protected int poolSize; // 线程池大小

   构造函数传入了线程池名称、线程名称和线程池大小三个参数,其中线程池名称用来构造父类ThreadGroup,线程名称用于构造任务派发线程DispatcherThread实例,根据线程池大小初始化了pool成员,生成了多个WorkerThread线程,接着用了下面一段代码:

        synchronized (this) {
            try {
                pool[i].start();
// 启动该工作线程
                wait();
// 本线程进入等待状态,是在等待工作线程完成工作准备?稍后再确定。
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
        }

    public synchronized void assign(WorkerTask task)方法为线程池分派一个任务,遍历工作线程池,发现空闲即通过WorkThread的assign方法分派该task,如果没有空闲线程,则进入等待状态,被唤醒后再次遍历。看样子WorkThread线程在完成工作和准备完毕时都会唤醒WorkerThreadPool。

    public void assignGroupTask(DispatcherTask task)方法指定一个分派器任务,由dispatcherThread成员的assign方法接收。

    其他方法即计算线程池的使用情况,都是遍历线程池然后累加得到一个结果。

    下一步分析WorkerThread和DispatcherThread的代码,看看怎么完成指定任务的。

你可能感兴趣的:(Java,JSpider)