當Httpclient遇到執行緒池 記一次爬蟲經歷

2021-07-06 05:30:39 字數 1066 閱讀 5149

要抓的資料量有點多,很多個頁面,並且都一樣的處理,那麼直接就上線程池吧.搜了搜,得到了結果,用executors.newfixedthreadpool()來生產出乙個固定大小的執行緒池,後面所有的任務都會被放置在任務佇列中.ok,開始寫

建立執行緒池

executorservice executorservice = executors.newfixedthreadpool(10);

這就建立了乙個大小為10的執行緒池

提交任務
executorservice.submit(runnable task);

等待所有任務都完成再繼續執行下面的**
executorservice.shutdown();//不在接受新任務

while (true)

thread.sleep(1000);

}

這是我提交任務的**
//crawl是我實現runnable介面的類

executorservice.submit(new crawl(client));//把外部的client例項傳進去

在於提交任務這一條**,我的task最開始需要外部提供乙個httpclient例項,我的實現是在外部只生成乙個httpclient例項,每次啟動新任務都把這個client傳進去(心想著這樣可以省去在每個執行緒中生成新client的過程,應該可以提高效率)

但是事實是用上面的方法真的是特別特別的慢,雖然可能是比單執行緒快,但是還是慢的讓人著急,並且在抓一些資料後會頻繁發生各種」超時異常」,直到我靈光一現,想著讓每個執行緒自己去new自己的httpclient物件吧,不管它了,試一試,一下子,我感覺自己在天上飛,真的,飛起來了,快的我想哭.真的

重要的事說三遍

請在每個執行緒中生成自己的httpclient例項

請在每個執行緒中生成自己的httpclient例項

請在每個執行緒中生成自己的httpclient例項

當CAsyncSocket遇到多執行緒

用多執行緒方法設計socket程式時,你會發現在跨執行緒使用casyncsocket及其派生類時,會出現程式崩潰。所謂跨執行緒,是指該物件在乙個執行緒中呼叫create attachhandle attach函式,然後在另外乙個執行緒中呼叫其他成員函式。下面的例子就是乙個典型的導致崩潰的過程 cas...

當流氓遇到劫匪

當流氓遇到劫匪 文 寧宇 周五看到六家網際網路公司聯合發表的宣告,抵制流量劫持等違法行為,有人認為這矛頭直指運營商。我對這個領域並不太懂,但也看這其中有很多誤解,還是有必要解釋一下的。首先,從純技術的角度看 流量劫持 客戶原本想訪問a 但是中間有人用技術手段,使實際開啟的是b 這些利用技術手段調整使...

當回車遇到換行

大家在寫文件或者寫 時都經常會用到換行操作,實際上我們都是使用鍵盤上的回車鍵進行換行。那麼,今天的問題來了,在按下回車鍵時系統做了哪些處理?回車鍵盤只是換行嗎?回車和換行是同一回事嗎?但實際並非完全如此。我們再來看看什麼是回車鍵,在打字機上有乙個叫字車的部件,在打字的時候它會根據所打的字元向前移動,...