知识大全 Heritrix的多线程ToeThread和ToePool

Posted hr

篇首语:惜时专心苦读是做学问的一个好方法。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 Heritrix的多线程ToeThread和ToePool相关的知识,希望对你有一定的参考价值。

Heritrix的多线程ToeThread和ToePool  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  想要更有效更快速的抓取网页内容 则必须采用多线程 Heritrix中提供了一个标准的线程池ToePool 它用于管理所有的抓取线程 ToePool和ToeThread都位于 archive crawler framework包中 前面已经说过ToePool的初始化 是在CrawlController的initialize()方法中完成的 来看一下ToePool以及ToeThread是如何被初始化的 以下代码是在CrawlController中用于对ToePool进行初始化的     构造函数 toePool = new ToePool(this);    // 按order xml中的配置 实例化并启动线程    toePool setSize(order getMaxToes()); ToePool的构造函数很简单 如下所示 public ToePool(CrawlController c)      super( ToeThreads );     ntroller = c;    它仅仅是调用了父类java lang ThreadGroup的构造函数 同时 将注入的CrawlController赋给类变量 这样 便建立起了一个线程池的实例了 但是 那些真正的工作线程又是如何建立的呢?    下面来看一下线程池中的setSize(int)方法 从名称上看 这个方法很像是一个普通的赋值方法 但实际上 它并不是那么简单 public void setSize(int newsize)         targetSize = newsize;     int difference = newsize getToeCount();

  // 如果发现线程池中的实际线程数量小于应有的数量     // 则启动新的线程     if (difference > )           for(int i = ; i <= difference; i++)            // 启动新线程              startNewThread();                // 如果线程池中的线程数量已经达到需要     else    

  int retainedToes = targetSize;          // 将线程池中的线程管理起来放入数组中          Thread[] toes = this getToes();

  // 循环去除多余的线程          for (int i = ; i < toes length ; i++)               if(!(toes[i] instanceof ToeThread))                    continue;                            retainedToes ;              if (retainedToes>= )                    continue;                            ToeThread tt = (ToeThread)toes[i];              tt retire();                  

  // 用于取得所有属于当前线程池的线程    private Thread[] getToes()         Thread[] toes = new Thread[activeCount()+ ];     // 由于ToePool继承自java lang ThreadGroup类     // 因此当调用enumerate(Thread[] toes)方法时      // 实际上是将所有该ThreadGroup中开辟的线程放入     // toes这个数组中 以备后面的管理     this enumerate(toes);     return toes;   

  // 开启一个新线程    private synchronized void startNewThread()         ToeThread newThread = new ToeThread(this nextSerialNumber++);     newThread setPriority(DEFAULT_TOE_PRIORITY);     newThread start();    通过上面的代码可以得出这样的结论 线程池本身在创建的时候 并没有任何活动的线程实例 只有当它的setSize方法被调用时 才有可能创建新线程 如果当setSize方法被调用多次而传入不同的参数时 线程池会根据参数里所设定的值的大小 来决定池中所管理线程数量的增减

    当线程被启动后 所执行的是其run()方法中的片段 接下来 看一个ToeThread到底是如何处理从Frontier中获得的链接的 public void run()         String name = controller getOrder() getCrawlOrderName();     logger fine(getName()+ started for order +name+ );

  try       while ( true )                    // 检查是否应该继续处理       continueCheck();       setStep(STEP_ABOUT_TO_GET_URI);              // 使用Frontier的next方法从Frontier中              // 取出下一个要处理的链接              CrawlURI curi = controller getFrontier() next();              // 同步当前线程              synchronized(this)                   continueCheck();                  setCurrentCuri(curi);             

  /*               * 处理取出的链接               */              processCrawlUri();              setStep(STEP_ABOUT_TO_RETURN_URI);              // 检查是否应该继续处理              continueCheck();              // 使用Frontier的finished()方法              // 来对刚才处理的链接做收尾工作              // 比如将分析得到的新的链接加入              // 到等待队列中去              synchronized(this)                   controller getFrontier() finished(currentCuri);                  setCurrentCuri(null);             

  // 后续的处理              setStep(STEP_FINISHING_PROCESS);              lastFinishTime = System currentTimeMillis();          // 释放链接              controller releaseContinuePermission();              if(shouldRetire)                   break; // from while(true)                             catch (EndedException e)      catch (Exception e)          logger log(Level SEVERE Fatal exception in +getName() e);     catch (OutOfMemoryError err)          seriousError(err);     finally          controller releaseContinuePermission();          setCurrentCuri(null);

  // 清理缓存数据     this ();     this Recorder = null;     localProcessors = null;

cha138/Article/program/Java/ky/201311/28205

相关参考

知识大全 Java的多线程-实现多线程及线程的同步

Java的多线程-实现多线程及线程的同步  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  一.实现

知识大全 Linux下的多线程编程

Linux下的多线程编程  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  引言    线程(thr

知识大全 详细讲解C#的多线程能力

详细讲解C#的多线程能力  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  线程是允许进行并行计算的

知识大全 基于.NET的多线程编程入门

基于.NET的多线程编程入门  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!多线程在构建大型系统的时

知识大全 针对用户界面的多线程

  现在我们也许能用一个线程解决在Counterjava中出现的问题采用的一个技巧便是在一个线程的run()方法中放置子任务——亦即位于go()内的循环一旦用户按下Start按钮线程就会启动但马上结束

知识大全 解析Java的多线程机制

解析Java的多线程机制  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  一进程与应用程序的区别 

知识大全 Java程序中的多线程

Java程序中的多线程  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  一为什么会排队等待?  下

知识大全 Java 程序中的多线程(四)

Java程序中的多线程(四)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  作者NeelVKum

知识大全 Java 程序中的多线程(二)

Java程序中的多线程(二)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  作者NeelVKum

知识大全 Java 程序中的多线程(一)

Java程序中的多线程(一)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  作者NeelVKum