知识大全 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的多线程-实现多线程及线程的同步 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 一.实现
Linux下的多线程编程 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 引言 线程(thr
详细讲解C#的多线程能力 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 线程是允许进行并行计算的
基于.NET的多线程编程入门 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!多线程在构建大型系统的时
现在我们也许能用一个线程解决在Counterjava中出现的问题采用的一个技巧便是在一个线程的run()方法中放置子任务——亦即位于go()内的循环一旦用户按下Start按钮线程就会启动但马上结束
解析Java的多线程机制 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 一进程与应用程序的区别
Java程序中的多线程 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 一为什么会排队等待? 下
Java程序中的多线程(四) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 作者NeelVKum
Java程序中的多线程(二) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 作者NeelVKum
Java程序中的多线程(一) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 作者NeelVKum