欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

淺談Java線程池是如何運行的

 更新時間:2020年11月27日 11:39:42   作者:caz  
這篇文章主要介紹了淺談Java線程池是如何運行的,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

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

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

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

從Thread到Executor

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

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

Executor接口就是第二點的體現(xiàn)。其execute方法用于執(zhí)行任務(wù),不必關(guān)系這個任務(wù)執(zhí)行的載體究竟是什么,到底有沒有創(chuàng)建線程。ThreadPoolExecutor實現(xiàn)類就是這個任務(wù)執(zhí)行器的線程池實現(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方法可以清楚了解其運行方式:

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

boolean addWorker(Runnable firstTask, boolean core)就是創(chuàng)建線程的方法,方法中第二個參數(shù)代表以corePoolSize還是maximumPoolSize為界,方法內(nèi)其余創(chuàng)建線程的細節(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í)行,以此來實現(xiàn)線程的復(fù)用,而不是只執(zhí)行完一個任務(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ù)是從阻塞隊列workQueue中取出的,并且根據(jù)配置allowCoreThreadTimeOut與線程個數(shù)是否大于corePoolSize,來決定使用BlockingQueue<Runable>的帶超時時間的取任務(wù)方法poll,還是阻塞取任務(wù)方法take,以實現(xiàn)任務(wù)列表為空時適時銷毀線程還是阻塞線程。

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

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

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

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

相關(guān)文章

  • SpringBoot 導(dǎo)出數(shù)據(jù)生成excel文件返回方式

    SpringBoot 導(dǎo)出數(shù)據(jù)生成excel文件返回方式

    這篇文章主要介紹了SpringBoot 導(dǎo)出數(shù)據(jù)生成excel文件返回方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-10-10
  • Java并發(fā)編程中構(gòu)建自定義同步工具

    Java并發(fā)編程中構(gòu)建自定義同步工具

    這篇文章主要介紹了Java并發(fā)編程中構(gòu)建自定義同步工具,本文講解了可阻塞狀態(tài)依賴操作的結(jié)構(gòu)、有界緩存實現(xiàn)基類示例、阻塞實現(xiàn)方式一:拋異常給調(diào)用者、阻塞實現(xiàn)方式二:通過輪詢和休眠、阻塞實現(xiàn)方式三:條件隊列等內(nèi)容,需要的朋友可以參考下
    2015-04-04
  • java實現(xiàn)數(shù)字猜拳小游戲

    java實現(xiàn)數(shù)字猜拳小游戲

    這篇文章主要為大家詳細介紹了java實現(xiàn)數(shù)字猜拳的小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-06-06
  • java調(diào)用微信現(xiàn)金紅包接口的心得與體會總結(jié)

    java調(diào)用微信現(xiàn)金紅包接口的心得與體會總結(jié)

    這篇文章主要介紹了java調(diào)用微信現(xiàn)金紅包接口的心得與體會總結(jié),有需要的朋友可以了解一下。
    2016-11-11
  • Springboot在有參構(gòu)造方法類中使用@Value注解取值

    Springboot在有參構(gòu)造方法類中使用@Value注解取值

    這篇文章主要介紹了Springboot在有參構(gòu)造方法類中使用@Value注解取值,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-06-06
  • idea快速搭建springboot項目的操作方法

    idea快速搭建springboot項目的操作方法

    下面小編就為大家分享一篇idea快速搭建springboot項目的操作方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2017-12-12
  • 使用javax.sound實現(xiàn)簡單音頻播放

    使用javax.sound實現(xiàn)簡單音頻播放

    這篇文章主要為大家詳細介紹了使用javax.sound實現(xiàn)簡單音頻播放,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • Springboot中依賴注入的三種方式詳解

    Springboot中依賴注入的三種方式詳解

    這篇文章主要介紹了Springboot中依賴注入的三種方式詳解,Setter Injection需要依賴@Autowired注解,使用方式與Field Injection有所不同,Field Injection時@Autowired是用在成員變量上,需要的朋友可以參考下
    2023-09-09
  • SpringBoot緩存Ehcache的使用詳解

    SpringBoot緩存Ehcache的使用詳解

    EhCache、Redis比較常用,使用Redis的時候需要先安裝Redis服務(wù)器,本文給大家介紹SpringBoot緩存Ehcache的使用詳解,感興趣的朋友跟隨小編一起看看吧
    2022-03-03
  • Spring?Data?Jpa框架最佳實踐示例

    Spring?Data?Jpa框架最佳實踐示例

    這篇文章主要為大家介紹了Spring?Data?Jpa框架最佳實踐示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪
    2022-02-02

最新評論