想要更有效更快速的抓取網頁內容
構造函數 toePool = new ToePool(this);
// 按order
toePool
super(
ntroller = c;
} 它僅僅是調用了父類java
下面來看一下線程池中的setSize(int)方法
{
targetSize = newsize;
int difference = newsize
// 如果發現線程池中的實際線程數量小於應有的數量
// 則啟動新的線程
if (difference >
for(int i =
// 啟動新線程
startNewThread();
}
}
// 如果線程池中的線程數量已經達到需要
else
{
int retainedToes = targetSize;
// 將線程池中的線程管理起來放入數組中
Thread[] toes = this
// 循環去除多余的線程
for (int i =
if(!(toes[i] instanceof ToeThread)) {
continue;
}
retainedToes
if (retainedToes>=
continue;
}
ToeThread tt = (ToeThread)toes[i];
tt
}
}
}
// 用於取得所有屬於當前線程池的線程
private Thread[] getToes()
{
Thread[] toes = new Thread[activeCount()+
// 由於ToePool繼承自java
// 因此當調用enumerate(Thread[] toes)方法時
// 實際上是將所有該ThreadGroup中開辟的線程放入
// toes這個數組中
this
return toes;
}
// 開啟一個新線程
private synchronized void startNewThread()
{
ToeThread newThread = new ToeThread(this
newThread
newThread
} 通過上面的代碼可以得出這樣的結論
當線程被啟動後
{
String name = controller
logger
try {
while ( true )
{
// 檢查是否應該繼續處理
continueCheck();
setStep(STEP_ABOUT_TO_GET_URI);
// 使用Frontier的next方法從Frontier中
// 取出下一個要處理的鏈接
CrawlURI curi = controller
// 同步當前線程
synchronized(this) {
continueCheck();
setCurrentCuri(curi);
}
/*
* 處理取出的鏈接
*/
processCrawlUri();
setStep(STEP_ABOUT_TO_RETURN_URI);
// 檢查是否應該繼續處理
continueCheck();
// 使用Frontier的finished()方法
// 來對剛才處理的鏈接做收尾工作
// 比如將分析得到的新的鏈接加入
// 到等待隊列中去
synchronized(this) {
controller
setCurrentCuri(null);
}
// 後續的處理
setStep(STEP_FINISHING_PROCESS);
lastFinishTime = System
// 釋放鏈接
controller
if(shouldRetire) {
break; // from while(true)
}
}
} catch (EndedException e) {
} catch (Exception e) {
logger
} catch (OutOfMemoryError err) {
seriousError(err);
} finally {
controller
}
setCurrentCuri(null);
// 清理緩存數據
this
this
localProcessors = null;
logger
setStep(STEP_FINISHED);
controller
controller = null;
} 在上面的方法中
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28205.html