日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[并发编程] - Executor框架#ThreadPoolExecutor源码解读02

發布時間:2025/3/21 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [并发编程] - Executor框架#ThreadPoolExecutor源码解读02 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • Pre
  • 線程池的具體實現
  • 線程池的創建
    • 參數解讀
      • corePoolSize
      • maximumPoolSize
      • keepAliveTime
      • unit
      • workQueue
      • threadFactory
      • handler
  • 任務提交
    • 方式一 提交任務無返回值
    • 方式二 提交任務有返回值
  • 線程池監控


Pre

Java-Java中的線程池原理分析及使用

[并發編程] - Executor框架#ThreadPoolExecutor源碼解讀01


線程池的具體實現

主要兩大類

  • ThreadPoolExecutor
  • ScheduledThreadPoolExecutor
  • 今天我們主要來看 ThreadPoolExecutor


    線程池的創建

    構造函數如上

    找個參數最多的講解下

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

    參數解讀

    corePoolSize

    線程池中的核心線程數,當提交一個任務時,線程池創建一個新線程執行任務,直到當前線程數等于corePoolSize;

    舉個例子,假設corePoolSize=5 , 第一個任務過來以后,會創建一個核心線程,第一個任務執行結束了,現在池子里有1個線程。 這時候第二個任務來的時候,不會用原來的這個空閑的線程,線程池還是會繼續創建核心線程。

    如果當前線程數為corePoolSize,繼續提交的任務被保存到阻塞隊列中,等待被執行

    如果執行了線程池的prestartAllCoreThreads()方法,線程池會提前創建并啟動所有核心線程。


    maximumPoolSize

    線程池中允許的最大線程數。如果當前阻塞隊列滿了,且繼續提交任務,則創建新的線程執行任務,前提是當前線程數小于maximumPoolSize;

    maximumPoolSize = 核心線程數 + 非核心線程數


    keepAliveTime

    線程池維護線程所允許的空閑時間。當線程池中的線程數量大于corePoolSize的時候,如果這時沒有新的任務提交,核心線程外的線程不會立即銷毀,而是會等待,直到等待的時間超過了keepAliveTime;


    unit

    keepAliveTime的單位;


    workQueue

    用來保存等待被執行的任務的阻塞隊列,且任務必須實現Runable接口。

    在JDK中提供了如下阻塞隊列:

  • ArrayBlockingQueue:基于數組結構的有界阻塞隊列,按FIFO排序任務;
  • LinkedBlockingQuene:基于鏈表結構的阻塞隊列,按FIFO排序任務,吞
    吐量通常要高于ArrayBlockingQuene;
  • SynchronousQuene:一個不存儲元素的阻塞隊列,每個插入操作必須等到
    另一個線程調用移除操作,否則插入操作一直處于阻塞狀態,吞吐量通常要高于LinkedBlockingQuene;
  • priorityBlockingQuene:具有優先級的無界阻塞隊列;

  • threadFactory

    它是ThreadFactory類型的變量,用來創建新線程。默認使用Executors.defaultThreadFactory() 來創建線程。

    使用默認的ThreadFactory來創建線程時,會使新創建的線程具有相同的NORM_PRIORITY優先級并且是非守護線程,同時也設置了線程的名稱。


    handler

    線程池的飽和策略,當阻塞隊列滿了,且沒有空閑的工作線程,如果繼續提交任務,必須采取一種策略處理該任務,線程池提供了4種策略:

  • AbortPolicy:直接拋出異常,默認策略;
  • CallerRunsPolicy:用調用者所在的線程來執行任務;
  • DiscardOldestPolicy:丟棄阻塞隊列中靠最前的任務,并執行當前任務;
  • DiscardPolicy:直接丟棄任務;
  • 上面的4種策略都是ThreadPoolExecutor的內部類.

    當然也可以根據應用場景實現RejectedExecutionHandler接口,自定義飽和策略,如記錄日志或持久化存儲不能處理的任務.


    任務提交

    方式一 提交任務無返回值

    public void execute() //提交任務無返回值

    方式二 提交任務有返回值

    public Future<?> submit() //任務執行完成后有返回值

    線程池監控

    public long getTaskCount() //線程池已執行與未執行的任務總數 public long getCompletedTaskCount() //已完成的任務數 public int getPoolSize() //線程池當前的線程數 public int getActiveCount() //線程池中正在執行任務的線程數量(大致數量,不一定準確)

    總結

    以上是生活随笔為你收集整理的[并发编程] - Executor框架#ThreadPoolExecutor源码解读02的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。