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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

阿里巴巴建议的线程池创建方式,你用上了吗?

發布時間:2023/12/20 编程问答 52 豆豆
生活随笔 收集整理的這篇文章主要介紹了 阿里巴巴建议的线程池创建方式,你用上了吗? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

來源:blog.csdn.net/dabusiGin/

article/details/105327873

Executor是不建議的

Executors類為我們提供了各種類型的線程池,經常使用的工廠方法有:

public?static?ExecutorService?newSingleThreadExecutor() public?static?ExecutorService?newFixedThreadPool(int?nThreads) public?static?ExecutorService?newCachedThreadPool() public?static?ScheduledExecutorService?newSingleThreadScheduledExecutor() public?static?ScheduledExecutorService?newScheduledThreadPool(int?corePoolSize)

書寫一段很簡單的測試代碼:

public?class?ThreadDemo?{public?static?void?main(String[]?args)?{ExecutorService?es?=?Executors.newSingleThreadExecutor();} }

當我們用阿里巴巴的P3C檢查代碼時,會被教育的!!!!

阿里爸爸是不允許這么創建線程池的,上面的警告寫的很明確“線程池不允許使用Executors去創建,而是通過ThreadPoolExecutor的方式,這樣的處理方式讓寫的同學更加明確線程池的運行規則,規避資源耗盡的風險。”(PS:很難得在編譯器中看到中文提示,對于英語不好的同學來說,簡直是福音,喜極而泣!!!!)

強制使用ThreadPoolExecutor

我們使用ThreadPoolExecutor創建線程池:

public?class?ThreadDemo?{public?static?void?main(String[]?args)?{ExecutorService?es?=?new?ThreadPoolExecutor(1,?1,?0L,?TimeUnit.MILLISECONDS,new?LinkedBlockingQueue<Runnable>(10),?Executors.defaultThreadFactory(),new?ThreadPoolExecutor.DiscardPolicy());} }

此時,再用P3C檢查代碼,終于沒有報錯了。

在華麗的分隔符之后,我們還是有必要從JDK源碼的層面深挖一下其中的原理。

首先是靜態方法newSingleThreadExecutor()、newFixedThreadPool(int nThreads)、newCachedThreadPool()。我們來看一下其源碼實現(基于JDK8)。

public?static?ExecutorService?newSingleThreadExecutor()?{return?new?FinalizableDelegatedExecutorService(new?ThreadPoolExecutor(1,?1,0L,?TimeUnit.MILLISECONDS,new?LinkedBlockingQueue<Runnable>())); }public?static?ExecutorService?newFixedThreadPool(int?nThreads)?{return?new?ThreadPoolExecutor(nThreads,?nThreads,0L,?TimeUnit.MILLISECONDS,new?LinkedBlockingQueue<Runnable>()); }public?static?ExecutorService?newCachedThreadPool()?{return?new?ThreadPoolExecutor(0,?Integer.MAX_VALUE,60L,?TimeUnit.SECONDS,new?SynchronousQueue<Runnable>()); }

通過查看源碼我們知道上述三種靜態方法的內部實現均使用了ThreadPoolExecutor類。難怪阿里爸爸會建議通過ThreadPoolExecutor的方式實現,原來Executors類的靜態方法也是用的它,只不過幫我們配了一些參數而已。

第二是ThreadPoolExecutor類的構造方法。既然現在要直接使用ThreadPoolExecutor類了,那么其中的初始化參數就要我們自己配了,了解其構造方法勢在必行。

ThreadPoolExecutor類一共有四個構造方法,我們只需要了解之中的一個就可以了,因為其他三種構造方法只是幫我們配置了一些默認參數,最后還是調用了它。

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

其中的參數含義是:

  • corePoolSize:線程池中的線程數量;

  • maximumPoolSize:線程池中的最大線程數量;

  • keepAliveTime:當線程池線程數量超過corePoolSize時,多余的空閑線程會在多長時間內被銷毀;

  • unit:keepAliveTime的時間單位;

  • workQueue:任務隊列,被提交但是尚未被執行的任務;

  • threadFactory:線程工廠,用于創建線程,一般情況下使用默認的,即Executors類的靜態方法defaultThreadFactory();handler:拒絕策略。當任務太多來不及處理時,如何拒絕任務。

對于這些參數要有以下了解:

corePoolSize與maximumPoolSize的關系

首先corePoolSize肯定是 <= maximumPoolSize。

其他關系如下:

  • 若當前線程池中線程數 < corePoolSize,則每來一個任務就創建一個線程去執行;

  • 若當前線程池中線程數 >= corePoolSize,會嘗試將任務添加到任務隊列。如果添加成功,則任務會等待空閑線程將其取出并執行;

  • 若隊列已滿,且當前線程池中線程數 < maximumPoolSize,創建新的線程;

  • 若當前線程池中線程數 >= maximumPoolSize,則會采用拒絕策略(JDK提供了四種,下面會介紹到)。

注意:關系3是針對的有界隊列,無界隊列永遠都不會滿,所以只有前2種關系。

學習資料:Java進階視頻資源

workQueue

參數workQueue是指提交但未執行的任務隊列。若當前線程池中線程數>=corePoolSize時,就會嘗試將任務添加到任務隊列中。主要有以下幾種:

  • SynchronousQueue:直接提交隊列。SynchronousQueue沒有容量,所以實際上提交的任務不會被添加到任務隊列,總是將新任務提交給線程執行,如果沒有空閑的線程,則嘗試創建新的線程,如果線程數量已經達到最大值(maximumPoolSize),則執行拒絕策略。

  • LinkedBlockingQueue:無界的任務隊列。當有新的任務來到時,若系統的線程數小于corePoolSize,線程池會創建新的線程執行任務;當系統的線程數量等于corePoolSize后,因為是無界的任務隊列,總是能成功將任務添加到任務隊列中,所以線程數量不再增加。若任務創建的速度遠大于任務處理的速度,無界隊列會快速增長,直到內存耗盡。

handler

JDK內置了四種拒絕策略:

  • DiscardOldestPolicy策略:丟棄任務隊列中最早添加的任務,并嘗試提交當前任務;

  • CallerRunsPolicy策略:調用主線程執行被拒絕的任務,這提供了一種簡單的反饋控制機制,將降低新任務的提交速度。

  • DiscardPolicy策略:默默丟棄無法處理的任務,不予任何處理。

  • AbortPolicy策略:直接拋出異常,阻止系統正常工作。

至此,我們直接new ThreadPoolExecutor類就不用慌了!!!!

推薦閱讀:

世界的真實格局分析,地球人類社會底層運行原理

不是你需要中臺,而是一名合格的架構師(附各大廠中臺建設PPT)

企業IT技術架構規劃方案

論數字化轉型——轉什么,如何轉?

華為干部與人才發展手冊(附PPT)

企業10大管理流程圖,數字化轉型從業者必備!

【中臺實踐】華為大數據中臺架構分享.pdf

華為的數字化轉型方法論

華為如何實施數字化轉型(附PPT)

超詳細280頁Docker實戰文檔!開放下載

華為大數據解決方案(PPT)

總結

以上是生活随笔為你收集整理的阿里巴巴建议的线程池创建方式,你用上了吗?的全部內容,希望文章能夠幫你解決所遇到的問題。

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