線程池原理

我們可以把併發執行的任務傳遞給一個線程池,來替代爲每個併發執行的任務都啓動一個新的線程。只要池裏有空閒的線程,任務就會分配給一個線程執行。在線程池的內部,任務被插入一個阻塞隊列(Blocking Queue ),線程池裏的線程會去取這個隊列裏的任務。當一個新任務插入隊列時,一個空閒線程就會成功的從隊列中取出任務並且執行它。

 

解析:合理的使用線程池便可重複利用已創建的線程,以減少在創建線程和銷燬線程上花費的時間和資源。除此之外,線程池在某些情況下還能動態的調整工作線程的數量,以平衡資源消耗和工作效率。同時線程池還提供了對池中工作線程進行統一的管理的相關方法。

線程池的工作模型主要兩部分組成,一部分是運行Runnable的Thread對象(工作線程),另一部分就是阻塞隊列(執行任務的線程隊列)。

 由線程池創建的Thread對象其內部的run方法會通過阻塞隊列的take方法獲取一個Runnable對象,然後執行這個Runnable對象的run方法(在Thread的run方法中調用Runnable對象的run方法)。當Runnable對象的run方法執行完畢以後,Thread中的run方法又循環的從阻塞隊列中獲取下一個Runnable對象繼續執行。這樣就實現了Thread對象的重複利用,也就減少了創建線程和銷燬線程所消耗的資源。

當需要向線程池提交任務時會調用阻塞隊列的offer方法向隊列的尾部添加任務。提交的任務實際上就是Runnable對象。

CachedThreadPool的特點就是在線程池空閒時,即線程池中沒有可運行任務時,它會釋放工作線程,從而釋放工作線程所佔用的資源。但是,但當出現新任務時,又要創建一新的工作線程,又要一定的系統開銷。並且,在使用CachedThreadPool時,一定要注意控制任務的數量,否則,由於大量線程同時運行,很有會造成系統癱瘓。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章