详解Heritrix多线程结构

原创 2011年01月22日 21:48:00

                               详解Heritrix多线程结构


想要更快速地抓取网页的内容,则必须采用多线程 抓取。

1.Heritrix中实现了一个标准的线程池ToePool,用于管理所有的抓取线程ToeThread.


2.ToePool和ToeThread都位于org.archive.crawler.framework包中.



3.ToePool的初始化实在CrawlController的initialize()方法中完成的.

       
        代码如下
            CrawlController的initialize ()方法
            {
                ...
               
                toePool = new ToePool(this);
                // 按order.xml中的配置,实例化并启动线程
                toePool.setSize(order.getMaxToes());
                ...
            }
           
4.ToePool的构造函数

        代码如下:
        public ToePool (CrawController c)
        {
            // 调用父类java.lang.ThreadGroup的构造函数
            super("ToeThreads");
            // 将注入的c付给类变量this.controller
            this.controller = c;
        }
5. ToePool的setSize方法
   
        流程图如下
       
        代码如下:
        // TODO:
       
6.总结:根据上面的代码,可以得出结论:线程池在创建的时候,并没有任何活动的线程实例;当线程池的setSize()方法被调用时,才创建新线程.

 

7.startNewThread方法
    代码如下:
    privatesynchronizedvoidstartNewThread(){
        ToeThread newThread = new ToeThread(this,nextSerialNumber++);
        // 设置线程优先级
        newThread.setPriority(DEFAULT_TOE_PRIORITY);
        // 起势:启动线程
        newThread.start();
    }
   
8.当启动ToeThread后(即newThread.start();),执行的是其run()方法中的代码.

9. run方法
 代码如下:
133     public void run() {
134         String name = controller.getOrder().getCrawlOrderName();
135         logger.fine(getName()+" started for order '"+name+"'");
136
137         try {
138             while ( true ) {
139                 // TODO check for thread-abort? or is waiting for interrupt enough?
140                 continueCheck();
141                
142                 setStep(STEP_ABOUT_TO_GET_URI);
143                
144                 CrawlURI curi = controller.getFrontier().next();
145                 // 如封似闭:同步当前线程
146                 synchronized(this) {
147                     continueCheck();
148                     setCurrentCuri(curi);
149                 }
150                 // 处理取出的链接
151                 processCrawlUri();
152                
153                 setStep(STEP_ABOUT_TO_RETURN_URI);
154                 continueCheck();
155                // 揽雀尾:如将分析得到的新的链接加入到等待队列中
156                 synchronized(this) {
157                     controller.getFrontier().finished(currentCuri);
158                     setCurrentCuri(null);
159                 }
160                
161                 setStep(STEP_FINISHING_PROCESS);
162                 lastFinishTime = System.currentTimeMillis();
                      // 放虎归山:释放链接
163                 controller.releaseContinuePermission();
164                 if(shouldRetire) {
165                     break; // from while(true)
166                 }
167             }
168         } catch (EndedException e) {
169             // crawl ended (or thread was retired), so allow thread to end
170         } catch (Exception e) {
171             // everything else (including interruption)
172             logger.log(Level.SEVERE,"Fatal exception in "+getName(),e);
173         } catch (OutOfMemoryError err) {
174             seriousError(err);
175         } finally {
176             controller.releaseContinuePermission();
177         }
178         setCurrentCuri(null);
179         // 收 势:Do cleanup so that objects can be GC.
180         this.httpRecorder.closeRecorders();
181         this.httpRecorder = null;
182         localProcessors = null;
183
184         logger.fine(getName()+" finished for order '"+name+"'");
185         setStep(STEP_FINISHED);
186         controller.toeEnded();
187         controller = null;
188     }

 

--------------------------------------------------------------------------------
reference 更多:

 

    CrawlController源码
    http://crawler.archive.org/xref/org/archive/crawler/framework/CrawlController.html

 

    ToeThread源码
    http://crawler.archive.org/xref/org/archive/crawler/framework/ToeThread.html

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

多线程下的select网络程序结构

我一直坚信,如果不是处理大规模客户端连接,是不需要使用epoll和IOCP的。我倾向于简单的东西,所以我一直用着select。 一直以来,我的网络程序结构就是在每一帧的开始select,有什么消息就...

介绍如何使用 POSIX 库在多线程环境中设计并发数据结构

简介 现在,您的计算机有四个 CPU 核;并行计算 是最时髦的主题,您急于掌握这种技术。但是,并行编程不只是在随便什么函数和方法中使用互斥锁和条件变量。C++ 开发人员必须掌握的关键技能之一是设计并...
  • realxie
  • realxie
  • 2012年03月27日 20:19
  • 4510

Java多线程详解

  • 2017年08月10日 20:40
  • 165KB
  • 下载

Delphi多线程及消息发送传递结构体参数

1、Unit2: unit Unit2; interface uses windows,classes,NMICMP,SysUtils,StdCtrls,messages; const WM_MY...

java多线程详解

  • 2012年07月30日 10:45
  • 341KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:详解Heritrix多线程结构
举报原因:
原因补充:

(最多只允许输入30个字)