執行緒池能幫助我們有效的管理執行緒,避免重複的建立銷毀執行緒。
newfixedthreadpool():固定執行緒數量的執行緒池
newsinglethreadexecutor():返回乙個只有乙個執行緒的執行緒池
newcachedthreadpool():返回乙個可根據實際情況調整執行緒數量的執行緒池
newsinglethreadscheduledexecutor():返回乙個scheduledexecutorservice物件,執行緒池大小為1,可以在某個時間執行某種功能
newscheduledthreadpool():返回乙個scheduledexecutorservice物件物件,但是這個執行緒池可以指定數量。
在做安居客爬蟲的時候,因為幾個任務同時做,我要知道前乙個任務完成沒有,只有當前乙個任務做完,我也取不到資料時這個任務才能停止。最開始我是直接每個任務5個執行緒一直跑,當這個任務的前乙個任務計數為5時就這個任務就停止。但是這樣就和沒有使用執行緒池一樣了。後來我找了幾種方法,根據邏輯不同可以選擇不同的方法。
倒計時器countdownlatch
這個適合執行緒數量知道的情況
public
class
test5
pool.shutdown();
try catch (interruptedexception e)
system.out.println("完成");
}}class t5thread extends thread
}
用執行緒池的isterminated()方法看是否還有沒有完成的任務
呼叫這個方法首先要呼叫shutdown()或者shutdownnow(),停止提交新的任務,不然呼叫isterminated()一直為false。以安居客爬蟲搜尋城市和地區的**為例
這是搜尋城市的執行緒,將城市的鏈結新增到鏈結,當集合的大小的為1時喚醒搜尋地區的執行緒。執行緒結束後將cityflag設為false,標誌城市搜尋完成
public
class
citysearchthread
extends
thread }}
}system.out.println("城市搜尋完成");
}catch (exception e) finally
}else
}}
用乙個執行緒從城市的集合裡面去取鏈結,取到以後就像執行緒池中新增乙個解析那個鏈結的任務。當新增完以後就呼叫pool.shutdown(),這時就隔一段時間去看執行緒池任務執行完沒有。執行完以後就把districtflag設為false,標誌地區搜尋完成。
public
class
districtsearchthread
extends
thread catch (exception e)
if (url == null) else catch (interruptedexception e) }}
}pool.execute(new searchutil(url));
}pool.shutdown();
while (true)
try catch (interruptedexception e) }}
class searchutil extends thread
@override
public
void
run() }}
} catch (exception e) }}
}}
}
這樣一層一層的巢狀多個執行緒就可以協同工作程式完成以後也能自動退出。 執行緒池的使用
簡而言之 兩個類 執行緒池的 類 public class threadpoolproxyfactory return mnormalthreadpoolproxy return public static threadpoolproxy createdownloadthreadpoolproxy ...
執行緒池的使用
如果在使用執行緒的時候就去建立乙個新執行緒,當併發的執行緒數量很多,並且每個執行緒都是執行乙個時間很短的任務就結束了,系統在建立和銷毀執行緒上花費的時間和消耗的系統資源都相當大,甚至要比處理任務的時間和資源要多的多,同時活動的執行緒也需要消耗系統資源.executor是乙個頂層介面,它只宣告了乙個方...
執行緒池的使用
runnable介面 通常,執行緒池都是通過執行緒池工廠建立,再呼叫執行緒池中的方法獲取執行緒,再通過執行緒去執行任務方法。使用執行緒池中線程物件的步驟 建立執行緒池物件 建立runnable介面子類物件 提交runnable介面子類物件 關閉執行緒池 public class threadpool...