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