Java线程池的工作原理与实现
簡單介紹
創(chuàng)建線程有兩種方式:繼承Thread或?qū)崿F(xiàn)Runnable.Thread實現(xiàn)了Runnable接口,提供了一個空的run()方法,所以不論是繼承Thread還是實現(xiàn)Runnable,都要有自己的run()方法。
一個線程創(chuàng)建后就存在,調(diào)用start()方法就開始運行(執(zhí)行run()方法),調(diào)用wait進入等待或調(diào)用sleep進入休眠期,順利運行完畢或休眠被中斷或運行過程中出現(xiàn)異常而退出。
wait和sleep比較:
sleep方法有:sleep(long millis),sleep(long millis, long nanos),調(diào)用sleep方法后,當前線程進入休眠期,暫停執(zhí)行,但該線程繼續(xù)擁有監(jiān)視資源的所有權(quán)。到達休眠時間后線程將繼續(xù)執(zhí)行,直到完成。若在 休眠期另一線程中斷該線程,則該線程退出。
wait方法有:wait(),wait(long timeout),wait(long timeout, long nanos),調(diào)用wait方法后,該線程放棄監(jiān)視資源的所有權(quán)進入等待狀態(tài);
wait():等待有其它的線程調(diào)用notify()或notifyAll()進入調(diào)度狀態(tài),與其它線程共同爭奪監(jiān)視。wait()相當于wait(0),wait(0, 0)。
wait(long timeout):當其它線程調(diào)用notify()或notifyAll(),或時間到達timeout亳秒,或有其它某線程中斷該線程,則該線程進入調(diào)度狀態(tài)。
wait(long timeout, long nanos):相當于wait(1000000*timeout + nanos),只不過時間單位為納秒。
線程池的作用:
線程池作用就是限制系統(tǒng)中執(zhí)行線程的數(shù)量。
根據(jù)系統(tǒng)的環(huán)境情況,可以自動或手動設(shè)置線程數(shù)量,達到運行的最佳效果;少了浪費了系統(tǒng)資源,多了造成系統(tǒng)擁擠效率不高。用線程池控制線程數(shù) 量,其他線程排隊等候。一個任務(wù)執(zhí)行完畢,再從隊列的中取最前面的任務(wù)開始執(zhí)行。若隊列中沒有等待進程,線程池的這一資源處于等待。當一個新任務(wù)需要運行 時,如果線程池中有等待的工作線程,就可以開始運行了;否則進入等待隊列。
為什么要用線程池:
減少了創(chuàng)建和銷毀線程的次數(shù),每個工作線程都可以被重復(fù)利用,可執(zhí)行多個任務(wù)
可以根據(jù)系統(tǒng)的承受能力,調(diào)整線程池中工作線線程的數(shù)目,防止因為因為消耗過多的內(nèi)存,而把服務(wù)器累趴下(每個線程需要大約1MB內(nèi)存,線程開的越多,消耗的內(nèi)存也就越大,最后死機)
線程池:
多線程技術(shù)主要解決處理器單元內(nèi)多個線程執(zhí)行的問題,它可以顯著減少處理器單元的閑置時間,增加處理器單元的吞吐能力。
假設(shè)一個服務(wù)器完成一項任務(wù)所需時間為:T1 創(chuàng)建線程時間,T2 在線程中執(zhí)行任務(wù)的時間,T3 銷毀線程時間。
如果:T1 + T3 遠大于 T2,則可以采用線程池,以提高服務(wù)器性能。
一個線程池包括以下四個基本組成部分:
1、線程池管理器(ThreadPool):用于創(chuàng)建并管理線程池,包括 創(chuàng)建線程池,銷毀線程池,添加新任務(wù);
2、工作線程(PoolWorker):線程池中線程,在沒有任務(wù)時處于等待狀態(tài),可以循環(huán)的執(zhí)行任務(wù);
3、任務(wù)接口(Task):每個任務(wù)必須實現(xiàn)的接口,以供工作線程調(diào)度任務(wù)的執(zhí)行,它主要規(guī)定了任務(wù)的入口,任務(wù)執(zhí)行完后的收尾工作,任務(wù)的執(zhí)行狀態(tài)等;
4、任務(wù)隊列(taskQueue):用于存放沒有處理的任務(wù)。提供一種緩沖機制。
線程池技術(shù)正是關(guān)注如何縮短或調(diào)整T1,T3時間的技術(shù),從而提高服務(wù)器程序性能的。它把T1,T3分別安排在服務(wù)器程序的啟動和結(jié)束的時間段或者一些空閑的時間段,這樣在服務(wù)器程序處理客戶請求時,不會有T1,T3的開銷了。
線程池不僅調(diào)整T1,T3產(chǎn)生的時間段,而且它還顯著減少了創(chuàng)建線程的數(shù)目,看一個例子:
假設(shè)一個服務(wù)器一天要處理50000個請求,并且每個請求需要一個單獨的線程完成。在線程池中,線程數(shù)一般是固定的,所以產(chǎn)生線程總數(shù)不會超過 線程池中線程的數(shù)目,而如果服務(wù)器不利用線程池來處理這些請求則線程總數(shù)為50000.一般線程池大小是遠小于50000.所以利用線程池的服務(wù)器程序不 會為了創(chuàng)建50000而在處理請求時浪費時間,從而提高效率。
總結(jié)
以上是生活随笔為你收集整理的Java线程池的工作原理与实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: weblogic与sitemesh乱码问
- 下一篇: Java7的异常处理新特性-addSup