java多线程池
java線程池底層原理
三類線程池:
他 們底層都調(diào)用了ThreadPoolExecutor函數(shù),通過其中設(shè)置參數(shù)的不同做到處理方式上的不同。
一、newCachedThreadPool
CorePoolSize=0,MaximumPoolsize=max,keepalivetime=60L,workQueue=SynhronousQueue
即核心線程0個,總線程可以有l(wèi)ong max個,線程生命周期60,這意味著這些線程都是臨時線程。使用同步隊列(特點capacity=1)。
流程如下:
當有100個任務(wù)存在時,先取出一個任務(wù)放置在SynhronousQueue隊列中,然后尋找一個線程(可能新建也可能復用)用于處理該任務(wù),當接收任務(wù)之后就可以再取出任務(wù),重復上述操作。當一個任務(wù)完成之后使用的線程資源將會保存,等待復用(如果不想使用復用則可設(shè)置休眠時間)但不能超過線程的生命周期。
該線程池,可能會使用大量的線程從而極大消耗CPU資源,但是其內(nèi)存資源消耗較少,因為隊列始終只能接受1個任務(wù)。
二、newFixedThreadPool
CorePoolSize=setsize,MaximumPoolsize=setsize,keepalivetime=0,LinkedBlockingQueue
即核心線程setsize個,總線程也只能setsize個,即線程都為核心線程。使用Linked隊列(特點capacity=max)。
流程如下:
當有100個任務(wù)存在時,先取出setsize個任務(wù)使用核心線程處理,再將其余任務(wù)放置在隊列中。當任務(wù)結(jié)束之后將線程資源放回線程池保存等待使用,再從隊列中取出任務(wù),并使用線程處理,重復上述操作。該線程池,可能出現(xiàn)內(nèi)存溢出,因為其使用的隊列可能保存無窮個任務(wù),從而消耗大量的內(nèi)存資源。但是其cpu資源使用較少。
三、newSingleThreadExecutor
CorePoolSize=1,MaximumPoolsize=1,keepalivetime=0,LinkedBlockingQueue
即核心線程setsize個,總線程也只能setsize個,使用Linked隊列(特點capacity=max)。
流程如下:
當有100個任務(wù)存在時,先取出1個任務(wù)使用核心線程處理,再將其余任務(wù)放置在隊列中。當任務(wù)結(jié)束之后將線程資源放回線程池保存等待使用,再從隊列中取出任務(wù),并使用線程處理,重復上述操作。該線程池,可能出現(xiàn)內(nèi)存溢出原因同第二種情況。
延展:自定義線程池
使用ThreadPoolExecutor創(chuàng)建線程池
涉及到提交優(yōu)先級和執(zhí)行優(yōu)先級
提交優(yōu)先級:核心線程>隊列>臨時線程
執(zhí)行優(yōu)先級:核心線程>臨時線程>隊列
如果只是直接使用ThreadPoolExecutor創(chuàng)建線程池,沒有對可能出現(xiàn)的異常進行處理,會有報錯。
總結(jié)
- 上一篇: 程序图形化界面刷新以及如何从tkinte
- 下一篇: github文件上传全流程-新手入门系列