Java中的線程池是如何運(yùn)行的-創(chuàng)新互聯(lián)

本篇文章給大家分享的是有關(guān)Java中的線程池是如何運(yùn)行的,小編覺得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

創(chuàng)新互聯(lián)堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:網(wǎng)站制作、網(wǎng)站設(shè)計(jì)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的新化網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!

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


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

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


從Thread到Executor


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

  • 降低重復(fù)創(chuàng)建線程的開銷

  • 將任務(wù)與線程管理解耦

Executor接口就是第二點(diǎn)的體現(xiàn)。其execute方法用于執(zhí)行任務(wù),不必關(guān)系這個(gè)任務(wù)執(zhí)行的載體究竟是什么,到底有沒有創(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)行方式:

  1. 當(dāng)線程數(shù)小于corePoolSize時(shí),創(chuàng)建線程并執(zhí)行任務(wù);

  2. 若任務(wù)未通過步驟1添加,則入隊(duì)workQueue;(主要邏輯在if的條件判斷中,而if內(nèi)的邏輯處理的是在一些異常下,對(duì)入隊(duì)的回滾或補(bǔ)充創(chuàng)建線程)

  3. 若任務(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簡化如下:


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

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


另外查看簡化后的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,來決定使用BlockingQueue<Runable>的帶超時(shí)時(shí)間的取任務(wù)方法poll,還是阻塞取任務(wù)方法take,以實(shí)現(xiàn)任務(wù)列表為空時(shí)適時(shí)銷毀線程還是阻塞線程。


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


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

以上就是Java中的線程池是如何運(yùn)行的,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見到或用到的。希望你能通過這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

網(wǎng)站名稱:Java中的線程池是如何運(yùn)行的-創(chuàng)新互聯(lián)
文章路徑:http://muchs.cn/article36/csjjpg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站制作、外貿(mào)網(wǎng)站建設(shè)、App開發(fā)、網(wǎng)站建設(shè)、標(biāo)簽優(yōu)化、軟件開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站托管運(yùn)營