日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

java的線(xiàn)程池有幾種 java線(xiàn)程的創(chuàng)建方式( 四 )


阻塞隊(duì)列(BlockingQueue)是一個(gè)支持兩個(gè)附加操作的隊(duì)列 。這兩個(gè)附加的操作是:在隊(duì)列為空時(shí) , 獲取元素的線(xiàn)程會(huì)等待隊(duì)列變?yōu)榉强?。當(dāng)隊(duì)列滿(mǎn)時(shí) , 存儲(chǔ)元素的線(xiàn)程會(huì)等待隊(duì)列可用 。阻塞隊(duì)列常用于生產(chǎn)者和消費(fèi)者的場(chǎng)景 , 生產(chǎn)者是往隊(duì)列里添加元素的線(xiàn)程 , 消費(fèi)者是從隊(duì)列里拿元素的線(xiàn)程 。阻塞隊(duì)列就是生產(chǎn)者存放元素的容器 , 而消費(fèi)者也只從容器里拿元素 。
下圖中展示了線(xiàn)程1往阻塞隊(duì)列中添加元素 , 而線(xiàn)程2從阻塞隊(duì)列中移除元素:

java的線(xiàn)程池有幾種 java線(xiàn)程的創(chuàng)建方式


圖5 阻塞隊(duì)列
使用不同的隊(duì)列可以實(shí)現(xiàn)不一樣的任務(wù)存取策略 。在這里 , 我們可以再介紹下阻塞隊(duì)列的成員:

java的線(xiàn)程池有幾種 java線(xiàn)程的創(chuàng)建方式


2.3.3 任務(wù)申請(qǐng)
由上文的任務(wù)分配部分可知 , 任務(wù)的執(zhí)行有兩種可能:一種是任務(wù)直接由新創(chuàng)建的線(xiàn)程執(zhí)行 。另一種是線(xiàn)程從任務(wù)隊(duì)列中獲取任務(wù)然后執(zhí)行 , 執(zhí)行完任務(wù)的空閑線(xiàn)程會(huì)再次去從隊(duì)列中申請(qǐng)任務(wù)再去執(zhí)行 。第一種情況僅出現(xiàn)在線(xiàn)程初始創(chuàng)建的時(shí)候 , 第二種是線(xiàn)程獲取任務(wù)絕大多數(shù)的情況 。
線(xiàn)程需要從任務(wù)緩存模塊中不斷地取任務(wù)執(zhí)行 , 幫助線(xiàn)程從阻塞隊(duì)列中獲取任務(wù) , 實(shí)現(xiàn)線(xiàn)程管理模塊和任務(wù)管理模塊之間的通信 。這部分策略由getTask方法實(shí)現(xiàn) , 其執(zhí)行流程如下圖所示:

java的線(xiàn)程池有幾種 java線(xiàn)程的創(chuàng)建方式


圖6 獲取任務(wù)流程圖
getTask這部分進(jìn)行了多次判斷 , 為的是控制線(xiàn)程的數(shù)量 , 使其符合線(xiàn)程池的狀態(tài) 。如果線(xiàn)程池現(xiàn)在不應(yīng)該持有那么多線(xiàn)程 , 則會(huì)返回null值 。工作線(xiàn)程Worker會(huì)不斷接收新任務(wù)去執(zhí)行 , 而當(dāng)工作線(xiàn)程Worker接收不到任務(wù)的時(shí)候 , 就會(huì)開(kāi)始被回收 。
2.3.4 任務(wù)拒絕
任務(wù)拒絕模塊是線(xiàn)程池的保護(hù)部分 , 線(xiàn)程池有一個(gè)最大的容量 , 當(dāng)線(xiàn)程池的任務(wù)緩存隊(duì)列已滿(mǎn) , 并且線(xiàn)程池中的線(xiàn)程數(shù)目達(dá)到maximumPoolSize時(shí) , 就需要拒絕掉該任務(wù) , 采取任務(wù)拒絕策略 , 保護(hù)線(xiàn)程池 。
拒絕策略是一個(gè)接口 , 其設(shè)計(jì)如下:
publicinterfaceRejectedExecutionHandler{voidrejectedExecution(Runnabler,ThreadPoolExecutorexecutor);}用戶(hù)可以通過(guò)實(shí)現(xiàn)這個(gè)接口去定制拒絕策略 , 也可以選擇JDK提供的四種已有拒絕策略 , 其特點(diǎn)如下:

java的線(xiàn)程池有幾種 java線(xiàn)程的創(chuàng)建方式


2.4 Worker線(xiàn)程管理
2.4.1 Worker線(xiàn)程
線(xiàn)程池為了掌握線(xiàn)程的狀態(tài)并維護(hù)線(xiàn)程的生命周期 , 設(shè)計(jì)了線(xiàn)程池內(nèi)的工作線(xiàn)程Worker 。我們來(lái)看一下它的部分代碼:
privatefinalclassWorkerextendsAbstractQueuedSynchronizerimplementsRunnable{finalThreadthread;//Worker持有的線(xiàn)程RunnablefirstTask;//初始化的任務(wù) , 可以為null}Worker這個(gè)工作線(xiàn)程 , 實(shí)現(xiàn)了Runnable接口 , 并持有一個(gè)線(xiàn)程thread , 一個(gè)初始化的任務(wù)firstTask 。thread是在調(diào)用構(gòu)造方法時(shí)通過(guò)ThreadFactory來(lái)創(chuàng)建的線(xiàn)程 , 可以用來(lái)執(zhí)行任務(wù);firstTask用它來(lái)保存?zhèn)魅氲牡谝粋€(gè)任務(wù) , 這個(gè)任務(wù)可以有也可以為null 。如果這個(gè)值是非空的 , 那么線(xiàn)程就會(huì)在啟動(dòng)初期立即執(zhí)行這個(gè)任務(wù) , 也就對(duì)應(yīng)核心線(xiàn)程創(chuàng)建時(shí)的情況;如果這個(gè)值是null , 那么就需要?jiǎng)?chuàng)建一個(gè)線(xiàn)程去執(zhí)行任務(wù)列表(workQueue)中的任務(wù) , 也就是非核心線(xiàn)程的創(chuàng)建 。

推薦閱讀