java多线程总结五:线程池的原理及实现
1、線程池簡介:
??? 多線程技術(shù)主要解決處理器單元內(nèi)多個(gè)線程執(zhí)行的問題,它可以顯著減少處理器單元的閑置時(shí)間,增加處理器單元的吞吐能力。????
??? 假設(shè)一個(gè)服務(wù)器完成一項(xiàng)任務(wù)所需時(shí)間為:T1 創(chuàng)建線程時(shí)間,T2 在線程中執(zhí)行任務(wù)的時(shí)間,T3 銷毀線程時(shí)間。
??? 如果:T1 + T3 遠(yuǎn)大于 T2,則可以采用線程池,以提高服務(wù)器性能。
??????????????? 一個(gè)線程池包括以下四個(gè)基本組成部分:
??????????????? 1、線程池管理器(ThreadPool):用于創(chuàng)建并管理線程池,包括 創(chuàng)建線程池,銷毀線程池,添加新任務(wù);
??????????????? 2、工作線程(PoolWorker):線程池中線程,在沒有任務(wù)時(shí)處于等待狀態(tài),可以循環(huán)的執(zhí)行任務(wù);
??????????????? 3、任務(wù)接口(Task):每個(gè)任務(wù)必須實(shí)現(xiàn)的接口,以供工作線程調(diào)度任務(wù)的執(zhí)行,它主要規(guī)定了任務(wù)的入口,任務(wù)執(zhí)行完后的收尾工作,任務(wù)的執(zhí)行狀態(tài)等;
??????????????? 4、任務(wù)隊(duì)列(taskQueue):用于存放沒有處理的任務(wù)。提供一種緩沖機(jī)制。
????????????????
??? 線程池技術(shù)正是關(guān)注如何縮短或調(diào)整T1,T3時(shí)間的技術(shù),從而提高服務(wù)器程序性能的。它把T1,T3分別安排在服務(wù)器程序的啟動(dòng)和結(jié)束的時(shí)間段或者一些空閑的時(shí)間段,這樣在服務(wù)器程序處理客戶請(qǐng)求時(shí),不會(huì)有T1,T3的開銷了。
??? 線程池不僅調(diào)整T1,T3產(chǎn)生的時(shí)間段,而且它還顯著減少了創(chuàng)建線程的數(shù)目,看一個(gè)例子:
??? 假設(shè)一個(gè)服務(wù)器一天要處理50000個(gè)請(qǐng)求,并且每個(gè)請(qǐng)求需要一個(gè)單獨(dú)的線程完成。在線程池中,線程數(shù)一般是固定的,所以產(chǎn)生線程總數(shù)不會(huì)超過線程池中線程的數(shù)目,而如果服務(wù)器不利用線程池來處理這些請(qǐng)求則線程總數(shù)為50000。一般線程池大小是遠(yuǎn)小于50000。所以利用線程池的服務(wù)器程序不會(huì)為了創(chuàng)建50000而在處理請(qǐng)求時(shí)浪費(fèi)時(shí)間,從而提高效率。
??? 代碼實(shí)現(xiàn)中并沒有實(shí)現(xiàn)任務(wù)接口,而是把Runnable對(duì)象加入到線程池管理器(ThreadPool),然后剩下的事情就由線程池管理器(ThreadPool)來完成了
?
[java]?view plaincopy?
測試代碼:
[java]?view plaincopy
?
運(yùn)行結(jié)果:
WorkThread number:3? finished task number:0? wait task number:6
任務(wù) 1 完成
任務(wù) 2 完成
任務(wù) 3 完成
任務(wù) 4 完成
任務(wù) 5 完成
任務(wù) 6 完成
WorkThread number:3? finished task number:6? wait task number:0
分析:由于并沒有任務(wù)接口,傳入的可以是自定義的任何任務(wù),所以線程池并不能準(zhǔn)確的判斷該任務(wù)是否真正的已經(jīng)完成(真正完成該任務(wù)是這個(gè)任務(wù)的run方法執(zhí)行完畢),只能知道該任務(wù)已經(jīng)出了任務(wù)隊(duì)列,正在執(zhí)行或者已經(jīng)完成。
?
2、java類庫中提供的線程池簡介:
???? java提供的線程池更加強(qiáng)大,相信理解線程池的工作原理,看類庫中的線程池就不會(huì)感到陌生了。
?
?
?
?
?
其他具體內(nèi)容查看jdk幫助或看jdk源代碼吧。。。
參考文章:http://hi.baidu.com/obullxl/blog/item/ee50ad1ba8e8ff1f8718bf66.html
轉(zhuǎn)載于:https://www.cnblogs.com/kinghitomi/archive/2012/01/19/2327418.html
總結(jié)
以上是生活随笔為你收集整理的java多线程总结五:线程池的原理及实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hdu 1999
- 下一篇: WebBrowser1.Navigate