今天查看了java的Executor框架源碼,在此記錄一下,以便查閱。
(一),Executor的線程池通過ThreadPoolExecutor實(shí)現(xiàn),Executors是他的工廠類,這里只說三種常用的類, ?1,Executors.newSingleThreadExecutor():線程池中只有一個(gè)線程,當(dāng)線程執(zhí)行結(jié)束,或因?yàn)槠渌蜻M(jìn)入DEAD狀態(tài),則會(huì)再次創(chuàng)建一個(gè)線程供使用; ?2,Executors.newFixedThreadPool(nThreads):固定數(shù)量的線程池,nThreads為線程池創(chuàng)建時(shí)指定的線程數(shù)量,當(dāng)池中線程數(shù)量不足這個(gè)數(shù)時(shí),如果有任務(wù),則會(huì)新建一個(gè)線程,當(dāng)線程執(zhí)行結(jié)束,或因?yàn)槠渌蜻M(jìn)入DEAD狀態(tài),則會(huì)再次創(chuàng)建一個(gè)線程供使用; ?3,Executors.newCachedThreadPool():比較智能的線程池,理論上說,沒有線程池?cái)?shù)限制,如果jvm或計(jì)算機(jī)運(yùn)行,可以一直創(chuàng)建,當(dāng)然這是不存在的,一般jvm都會(huì)有線程上限。當(dāng)有新任務(wù)的時(shí)候,自動(dòng)創(chuàng)建線程來執(zhí)行,當(dāng)線程執(zhí)行完畢后,或因其他原因停止后,如果沒有allowTimeOut限制,則會(huì)自動(dòng)回收(一般是60s)。
(二)ThreadPoolExecutor是通過內(nèi)部類Worker類來添加線程的,Worker類是一個(gè)Runnable對(duì)象,類中自身包含有一個(gè)Thread對(duì)象,當(dāng)你在運(yùn)行worker的run方法時(shí),其實(shí)他啟動(dòng)的就是他本身里的Thread;
(三)說了這么多,那么多線程的原理是什么? ?要知道這個(gè),首先要明白,線程有5個(gè)狀態(tài):new,runable,running,block,dead;當(dāng)新建一個(gè)線程的時(shí)候,就是new狀態(tài),當(dāng)線程結(jié)束了,就是dead狀態(tài)。好了,也就是說,線程活著的時(shí)候就是在:runable, running, block狀態(tài)之間;
多線程的實(shí)現(xiàn),也就是多線程的復(fù)用過程,也就是說要維持線程在這三個(gè)狀態(tài)之間轉(zhuǎn)換,如何做到呢?
剛剛說到,ThreadPoolExecutor是通過worker來添加線程的,那么在worker里的runWorker方法中,他會(huì)不斷的查詢workQueue(阻塞隊(duì)列)來取任務(wù)執(zhí)行。那么workQueue的數(shù)據(jù)時(shí)如何添加的呢?
這里寫一下,當(dāng)新任務(wù)來的時(shí)候,線程池的工作過程: 1,當(dāng)前線程數(shù) < corePoolSize:即當(dāng)前運(yùn)行的線程數(shù),小于核心線程數(shù)量,則立即創(chuàng)建一個(gè)線程來執(zhí)行任務(wù);
2,當(dāng)前線程數(shù) >= corePoolSize AND workQueue未滿:此時(shí),將任務(wù)添加到workQueue里,等待處理;
3,當(dāng)前線程數(shù) >= corePoolSize AND workQueue滿了 AND 當(dāng)前線程數(shù)
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注