午夜剧场伦理_日本一道高清_国产又黄又硬_91黄色网战_女同久久另类69精品国产_妹妹的朋友在线

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

淺談Java線程池是如何運(yùn)行的

瀏覽:41日期:2022-08-20 13:21:24

異步編程工具在Android開(kāi)發(fā)中目前最被推薦的就是Kotlin協(xié)程,在引入Kotlin協(xié)程機(jī)制前,除了響應(yīng)式擴(kuò)展(RxJava)兼任異步編程工具外,Java API中線程與線程池就是最重要異步編程手段。而對(duì)于Android平臺(tái)的Kotlin協(xié)程實(shí)現(xiàn)來(lái)說(shuō),依然使用的是線程池來(lái)作為任務(wù)執(zhí)行的載體,所以可以將Android平臺(tái)的Kotlin協(xié)程簡(jiǎn)單的理解是對(duì)線程池的一種高度封裝。

Executors.newFixedThreadPool(10).asCoroutineDispatcher()Dispatchers.IO.asExecutor()

因此我們先了解Java線程池是如何運(yùn)行的,再深入理解Kotlin協(xié)程是如何實(shí)現(xiàn)的。

從Thread到Executor

線程的創(chuàng)建通過(guò)Thread類,為了復(fù)用線程而進(jìn)行池化就有了線程池。線程池帶來(lái)了兩點(diǎn)明顯優(yōu)勢(shì):

降低重復(fù)創(chuàng)建線程的開(kāi)銷 將任務(wù)與線程管理解耦

Executor接口就是第二點(diǎn)的體現(xiàn)。其execute方法用于執(zhí)行任務(wù),不必關(guān)系這個(gè)任務(wù)執(zhí)行的載體究竟是什么,到底有沒(méi)有創(chuàng)建線程。ThreadPoolExecutor實(shí)現(xiàn)類就是這個(gè)任務(wù)執(zhí)行器的線程池實(shí)現(xiàn)。

ThreadPoolExecutor的任務(wù)添加與線程復(fù)用

public void execute(Runnable command) { if (command == null) throw new NullPointerException(); int c = ctl.get(); if (workerCountOf(c) < corePoolSize) { if (addWorker(command, true)) return; c = ctl.get(); }//1 if (isRunning(c) && workQueue.offer(command)) { int recheck = ctl.get(); if (! isRunning(recheck) && remove(command)) reject(command); else if (workerCountOf(recheck) == 0) addWorker(null, false); }//2 else if (!addWorker(command, false)) reject(command);//3 }

查看execute方法可以清楚了解其運(yùn)行方式:

當(dāng)線程數(shù)小于corePoolSize時(shí),創(chuàng)建線程并執(zhí)行任務(wù); 若任務(wù)未通過(guò)步驟1添加,則入隊(duì)workQueue;(主要邏輯在if的條件判斷中,而if內(nèi)的邏輯處理的是在一些異常下,對(duì)入隊(duì)的回滾或補(bǔ)充創(chuàng)建線程) 若任務(wù)未入隊(duì),則仍創(chuàng)建線程(上限為maximumPoolSize)并執(zhí)行任務(wù),失敗則執(zhí)行拒絕策略。

boolean addWorker(Runnable firstTask, boolean core)就是創(chuàng)建線程的方法,方法中第二個(gè)參數(shù)代表以corePoolSize還是maximumPoolSize為界,方法內(nèi)其余創(chuàng)建線程的細(xì)節(jié)邏輯不深究。但要關(guān)注一下線程的封裝類Worker,addWorker方法內(nèi)調(diào)用了Worker內(nèi)被封裝線程的start方法,執(zhí)行Worker的run方法。我們將run方法內(nèi)的runWorker簡(jiǎn)化如下:

void runWorker(Worker w) { Runnable task = w.firstTask; w.firstTask = null; while (task != null || (task = getTask()) != null) { task.run(); } }

可以發(fā)現(xiàn),初始任務(wù)執(zhí)行完后,不斷通過(guò)getTask方法獲取任務(wù)執(zhí)行,以此來(lái)實(shí)現(xiàn)線程的復(fù)用,而不是只執(zhí)行完一個(gè)任務(wù)就銷毀了線程。

另外查看簡(jiǎn)化后的getTask方法如下:

private Runnable getTask() { boolean timed = allowCoreThreadTimeOut || wc > corePoolSize; try { Runnable r = timed ? workQueue.poll(keepAliveTime, TimeUnit.NANOSECONDS) : workQueue.take(); if (r != null) return r; } catch (InterruptedException retry) { } }

任務(wù)是從阻塞隊(duì)列workQueue中取出的,并且根據(jù)配置allowCoreThreadTimeOut與線程個(gè)數(shù)是否大于corePoolSize,來(lái)決定使用BlockingQueue<Runable>的帶超時(shí)時(shí)間的取任務(wù)方法poll,還是阻塞取任務(wù)方法take,以實(shí)現(xiàn)任務(wù)列表為空時(shí)適時(shí)銷毀線程還是阻塞線程。

回過(guò)頭來(lái)看ThreadPoolExecutor的構(gòu)造方法:

public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory,RejectedExecutionHandler handler)

我們可以清楚的明白每個(gè)參數(shù)的含義,以及它是如何影響線程池中線程的復(fù)用了。

到此這篇關(guān)于淺談Java線程池是如何運(yùn)行的的文章就介紹到這了,更多相關(guān)Java 線程池內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 99热这里只有精品7 国产精品成熟老女人 | 免费毛片大全 | 日韩每日更新 | 欧美精品www | 亚洲天堂导航 | 亚洲精品午夜国产va久久成人 | 久久伊人免费 | 99免费观看视频 | 中文字幕在线免费观看 | 超碰在线人 | 深夜福利在线播放 | 久久成人一区二区 | 伊人网在线免费观看 | 韩国精品一区 | xxx一区二区 | 久久久久久久久久免费 | 奇米影视亚洲春色 | 欧美日韩亚洲国产综合 | 国产精品色视频 | 日本wwwwww| www.国产.com | 国产精品毛片va一区二区三区 | 日韩一区二区视频在线观看 | 国产福利视频 | 欧美一区二区在线观看视频 | 午夜视频免费在线观看 | 国产精品天天看 | 4438x五月天 黄色在线观看免费视频 | 欧美一区二区三区久久久 | 午夜精品极品粉嫩国产尤物 | 国产精品视频在线看 | 91 久久| 在线看v片 | 久久久精品福利 | 毛片在线观看视频 | 日韩在线观看一区二区 | 亚洲少妇激情 | 国产精彩视频 | 欧美极品一区二区三区 | 四虎影院最新网址 | 亚洲1级片 |