java線(xiàn)程池框架解析
使用Java中成型的框架來(lái)幫助我們開(kāi)發(fā)并發(fā)應(yīng)用即可以節(jié)省構(gòu)建項(xiàng)目的時(shí)間,也可以提高應(yīng)用的性能。以下是小編為大家搜索整理java線(xiàn)程池框架解析,希望能給大家?guī)?lái)幫助!更多精彩內(nèi)容請(qǐng)及時(shí)關(guān)注我們應(yīng)屆畢業(yè)生考試網(wǎng)!
Java對(duì)象實(shí)例的鎖一共有四種狀態(tài):無(wú)鎖,偏向鎖,輕量鎖和重量鎖。原始脫離框架的并發(fā)應(yīng)用大部分都需要手動(dòng)完成加鎖釋放,最直接的就是使用synchronized和volatile關(guān)鍵字對(duì)某個(gè)對(duì)象或者代碼塊加鎖從而限制每次訪(fǎng)問(wèn)的次數(shù),從對(duì)象之間的競(jìng)爭(zhēng)也可以實(shí)現(xiàn)到對(duì)象之間的協(xié)作。但是這樣手動(dòng)實(shí)現(xiàn)出來(lái)的應(yīng)用不僅耗費(fèi)時(shí)間而且性能表現(xiàn)往往又有待提升。
一、線(xiàn)程池結(jié)構(gòu)圖
二、示例
定義線(xiàn)程接口
6public class MyThread extends Thread {@Overridepublicvoid run() {System.out.println(Thread.currentThread().getName() + "正在執(zhí)行");}}
1:newSingleThreadExecutor
10ExecutorService pool = Executors. newSingleThreadExecutor();Thread t1 = new MyThread();Thread t2 = new MyThread();Thread t3 = new MyThread();/pic/pic/p>
輸入結(jié)果:
3pool-1-thread-1正在執(zhí)行pool-1-thread-1正在執(zhí)行pool-1-thread-1正在執(zhí)行
2:newFixedThreadPool
13ExecutorService pool = Executors.newFixedThreadPool(3);Thread t1 = new MyThread();Thread t2 = new MyThread();Thread t3 = new MyThread();Thread t4 = new MyThread();Thread t5 = new MyThread();/pic/p>
輸入結(jié)果:
4pool-1-thread-1正在執(zhí)行pool-1-thread-2正在執(zhí)行pool-1-thread-1正在執(zhí)行pool-1-thread-2正在執(zhí)行
3 :newCachedThreadPool
14ExecutorService pool = Executors.newCachedThreadPool();Thread t1 = new MyThread();Thread t2 = new MyThread();Thread t3 = new MyThread();Thread t4 = new MyThread();Thread t5 = new MyThread();/pic/pic/p>
輸入結(jié)果:
5pool-1-thread-2正在執(zhí)行pool-1-thread-4正在執(zhí)行pool-1-thread-3正在執(zhí)行pool-1-thread-1正在執(zhí)行pool-1-thread-5正在執(zhí)行
4 :ScheduledThreadPoolExecutor
14ScheduledExecutorService pool = Executors.newScheduledThreadPool(2);pool.scheduleAtFixedRate(new Runnable() {/pic/pic/pic/p>
輸入結(jié)果:
4================+++++++++++++++++++++++++++++++++++++++++++++++++++
三、線(xiàn)程池核心參數(shù)
corePoolSize : 池中核心的線(xiàn)程數(shù)
maximumPoolSize : 池中允許的最大線(xiàn)程數(shù)。
keepAliveTime : 當(dāng)線(xiàn)程數(shù)大于核心時(shí),此為終止前多余的空閑線(xiàn)程等待新任務(wù)的最長(zhǎng)時(shí)間。
unit : keepAliveTime 參數(shù)的時(shí)間單位。
workQueue : 執(zhí)行前用于保持任務(wù)的隊(duì)列。此隊(duì)列僅保持由 execute方法提交的 Runnable任務(wù)。
threadFactory : 執(zhí)行程序創(chuàng)建新線(xiàn)程時(shí)使用的工廠(chǎng)。
handler : 由于超出線(xiàn)程范圍和隊(duì)列容量而使執(zhí)行被阻塞時(shí)所使用的處理程序。
ThreadPoolExecutor :Executors類(lèi)的底層實(shí)現(xiàn)。
3.1 任務(wù)排隊(duì)機(jī)制
SynchonousQueue: 同步隊(duì)列,隊(duì)列直接提交給線(xiàn)程執(zhí)行而不保持它們,此時(shí)線(xiàn)程池通常是無(wú)界的
LinkedBlockingQueue: 無(wú)界對(duì)列,當(dāng)線(xiàn)程池線(xiàn)程數(shù)達(dá)到最大數(shù)量時(shí),新任務(wù)就會(huì)在隊(duì)列中等待執(zhí)行,可能會(huì)造成隊(duì)列無(wú)限膨脹
ArrayBlockingQueue : 有界隊(duì)列,有助于防止資源耗盡,一旦達(dá)到上限,可能會(huì)造成新任務(wù)丟失
注意:
newSingleThreadExecutor、newFixedThreadPool使用的是LinkedBlockingQueue
newCachedThreadPool 使用的是 SynchonousQueue
newScheduledThreadPool使用的是 DelayedWorkQueue
3.2 線(xiàn)程執(zhí)行流程
3.3 線(xiàn)程大小確定:
cpu密集型: 盡量少開(kāi)線(xiàn)程,最佳線(xiàn)程數(shù) Ncpu+1
io密集型:多開(kāi)線(xiàn)程,2Ncpu
混合型:根據(jù)情況而定,可以拆分成io密集和cou密集
【java線(xiàn)程池框架解析】相關(guān)文章:
java線(xiàn)程池框架解析方法10-04
什么是java線(xiàn)程池框架03-12
java線(xiàn)程池框架是什么01-11
Java 5線(xiàn)程池使用11-21
java中通用的線(xiàn)程池實(shí)例代碼12-18
JAVA多線(xiàn)程之線(xiàn)程間的通信方式解析08-22
java多線(xiàn)程10-24
java的多線(xiàn)程11-04