java新手揭秘:阿里巴巴為何禁止使用Executors來創建線程池

2020-12-25 一名普通的開發者

當一個java新手從不斷地Curd階段跳出來之後,就會學習java的並發,並行等高階用法,自然就會用到線程、線程池,線程池的好處這裡就不做詳細解釋,你應該會學習到Executors創建線程池的四個方法, 分別是:

newFixedThreadPool(int Threads):創建固定數目的線程池。newSingleThreadPoolExecutor():創建一個單線程的線程池。newCacheThreadPool():創建一個可緩存的線程池,調用execute將重用以前構成的線程。newScheduledThreadPool(int corePoolSize):創建一個支持定時及周期性的任務執行的線程池。常用的方法是newFixedThreadPoolnewCacheThreadPool。

但是,阿里巴巴的《Java開發手冊》關於線程池的用法中明確地指出:不允許使用Executors來創建線程池。

原因分析

從上圖分析都可以知道都是因為用Executors默認方法創建線程池,會允許創建最大長度為Integer.MAX_VALUE或者是大量的請求,從而導致OOM, 下面從new SingleExecutor源碼分析:

可以發現,在創建LinkedBlockingQueue時,並未指定容量。此時,LinkedBlockingQueue就是一個無邊界隊列,對於一個無邊界隊列來說,是可以不斷的向隊列中加入任務的,就有可能因為任務過多而導致內存溢出的問題。

正確的方式如下:

直接調用ThreadPoolExecutor的構造函數自己創建線程池,給BlockQueue指定容量就可以了。

阿里巴巴推薦線程池創建方式

方式1:commons-lang3

方式2:com.google.guava

方式3:ThreadPoolExecutor或者spring配置線程池方式

調用execute(Runnable task)方法即可

總結

java新手應該避免一開始就使用錯誤的方式,上面就是正確創建線程池的方式推薦,希望對你有所幫助。

相關焦點

  • 使用Executors,ThreadPoolExecutor,創建線程池,源碼分析理解
    當然 Executors 也是用不同的參數去 new ThreadPoolExecutor 實現的,本文先分析前四種線程創建方式,後在分析 new ThreadPoolExecutor 創建方式使用 Executors 創建線程池1.newFixedThreadPool()由於使用了LinkedBlockingQueue所以maximumPoolSize
  • 阿里面試官鬼得很,問我為什麼他們阿里要禁用Executors創建線程池?
    作者:何甜甜在嗎來源:http://rrd.me/eUh6V看阿里巴巴開發手冊並發編程這塊有一條:線程池不允許使用
  • Java中線程池的簡單使用
    線程池就是用來管理線程的在沒有接觸線程池之前,我們使用線程的時候就去創建一個線程,然後startup()就可以假設,你現在有一個while n(n=10000)的循環,每一次循環都要啟動一個線程去計算n的因數,這樣頻繁而且大量的創建線程,系統的效率會大幅下降
  • Java中線程池,你真的會用嗎?
    在文中有這樣一段描述:可以通過Executors靜態工廠構建線程池,但一般不建議這樣使用。關於這個問題,在那篇文章中並沒有深入的展開。作者之所以這麼說,是因為這種創建線程池的方式有很大的隱患,稍有不慎就有可能導致線上故障。本文我們就來圍繞這個問題來分析一下為什麼JDK自身提供的構建線程池的方式並不建議使用?
  • Java入門 - - - 線程池的基本使用
    產生問題:這樣頻繁創建線程會大大降低系統的效率(頻繁創建線程和銷毀線程需要時間開銷,對於系統來說創建線程的數量也是有限的),而且隨著線程的增加內存佔用也會過多,降低程序的運行效率。問題解決思路:我們可以用少量的線程保持工作且可以反覆執行任務(避免線程生命周期的損耗),這也就是要使用線程池。
  • Java之線程池的簡單介紹
    各位小夥伴們大家好,這次小編要簡單介紹一下Java中的線程池。在之前小編介紹線程的時候,如果我們使用線程的時候,就可以去創建一個線程,那樣實現起來就非常簡單,但是如果並發地線程數量很多,並且每一個線程都是執行一個時間很短的任務就結束了,這樣頻繁創建線程就會大大降低系統的效率,頻繁創建和銷毀線程需要時間。
  • 【線程池】java線程池ThreadPoolExecutor
    為什麼這裡說核心線程數而不是最小線程數是因為在線程池被創建後,並不會直接創建corePoolSize個線程,而是等任務到來時臨時創建。等按照需要創建了corePoolSize個線程之後,這些數量的線程即使閒置,也不會被線程池收回。這時即可以將這個值理解為線程池維護的最小線程數了。    maximumPoolSize 線程池維護的最大線程數。
  • 從使用到原理,探究Java線程池
    注意:這個時候線程池內的線程數已經超過了corePoolSize,超過corePoolSize的線程不會一直存活在線程池內,當他們閒下來時並超過keepAliveTime設定的時間後,就會被銷毀。如果線程數已經達到了maxPoolSize,這個時候如果再來任務,線程池就採取Handler所指定的拒絕策略拒絕任務。
  • 深入理解 Java 線程池!
    作者 | 阿文,責編 | 郭芮頭圖 | CSDN 下載自東方IC出品 | CSDN(ID:CSDNnews)在多線程和高並發場景中,需要創建大量的線程來進行業務處理這種問題使用線程池便可以很好的解決。通過線程池線程,銷毀及回收等交由線程池進行管理,就可以避免以上的問題。
  • 手寫Java線程池(超詳細解說)
    註:本文來自粉絲[菜鳥逆襲]投稿 線程池問題背景只是單純使用 new Thread(runnable).start(); 的方式創建線程, 將會導致嚴重的程序性能問題: 1.線程創建, 銷毀需要消耗很大的系統資源; 2.虛擬機創建線程的數量是有限的; 2.線程調度切換也將使程序性能下降; 針對這些問題, 對線程數量進行管理, 有效地重複利用線程
  • java線程池核心類ThreadPoolExecutor概述
    今天我們來講講其中的一種應用——線程池。有三種常見的創建線程的方法:繼承Thread類、實現Runnable接口和實現Callable接口。這些線程在運行結束後都會被虛擬機銷毀,如果線程數量多的話,頻繁的創建和銷毀線程會大大浪費時間和效率。更重要的是浪費內存,當線程執行完畢後死亡,線程對象就變成垃圾,造成GC的頻繁收集和停頓。
  • 七個方面帶你玩轉Java線程池
    來自:劍走偏鋒雨 | 責編:樂樂  正文  0  序言  在Java中,使用線程來異步執行任務。Java線程的創建與銷毀需要一定的開銷,如果我們為每一個任務創建一個新線程來執行,這些線程的創建和銷毀將消耗大量的計算資源。
  • Java從源碼角度分析創建線程池究竟有哪些方式
    前言在Java的高並發領域,線程池一直是一個繞不開的話題。有些童鞋一直在使用線程池,但是,對於如何創建線程池僅僅停留在使用Executors工具類的方式,那麼,創建線程池究竟存在哪幾種方式呢?就讓我們一起從創建線程池的源碼來深入分析究竟有哪些方式可以創建線程池。
  • 深入理解 Java 線程池,講解的太清晰了
    如此一來,會大大降低系統的效率,可能頻繁創建和銷毀線程的時間、資源開銷要大於實際工作的所需。正是由於這個問題,所以有必要引入線程池。使用 線程池的好處有以下幾點:降低資源消耗 - 通過重複利用已創建的線程降低線程創建和銷毀造成的消耗。
  • 圖解 | 阿里巴巴面試官愛問的線程池到底是什麼?
    為什麼阿里不允許使用 Executors 去創建線程池?線程池任務調度的流程大致講一下。線程池裡面的線程執行異常了會怎麼樣?核心線程和非核心線程是如何區分的?想要答對這些問題,並不是很難,但是想要答好,我覺得是非常考驗個人功底的。
  • 「原創」Java並發編程系列33|深入理解線程池(上)
    本文轉載自【微信公眾號:java進階架構師,ID:java_jiagoushi】經微信公眾號授權轉載,如需轉載與原文作者聯繫並發編程必不可少的線程池,接下來分兩篇文章介紹線程池,本文是第一篇。當任務到達時,任務可以不需要的等到線程創建就能立即執行。提高線程的可管理性。線程是稀缺資源,如果無限制的創建,不僅會消耗系統資源,還會降低系統的穩定性,使用線程池可以進行統一的分配,調優和監控。
  • java的線程創建方式
    Thread類java語言中的Thread類是一個基本的線程類,用於創建線程、中斷線程、獲取線程的基本信息、運行狀態等。我們首先了解下利用Thread類創建線程實例的二種方式。().getName()); }}//創建線程實例Thread thread = new MyThread();//啟動線程thread.start();實現Runable接口創建線程//實現runnable接口創建任務類class MyTask implements Runnable{//重寫run方法創建工作任務 public void run() {
  • Java線程池的四種用法與使用場景
    二、使用線程池有什麼優點1、線程池中線程的使用率提升,減少對象的創建、銷毀;2、線程池可以控制線程數,有效的提升伺服器的使用資源,避免由於資源不足而發生宕機等問題;三、線程池的四種使用方式1、newCachedThreadPool
  • Java並發編程系列34|深入理解線程池(下)
    本文轉載自【微信公眾號:java進階架構師,ID:java_jiagoushi】經微信公眾號授權轉載,如需轉載與原文作者聯繫本文是深入理解線程池下篇:線程池介紹Executor框架接口線程池狀態線程池參數線程池創建執行過程關閉線程池其他問題任務拒絕策略線程池中的線程初始化線程池容量的動態調整線程池的監控6.
  • 通過源碼解析,深入Java 線程池原理
    在編程領域,比較典型的池化技術有:線程池、連接池、內存池、對象池等。對象池通過復用對象來減少創建對象、垃圾回收的開銷;連接池(資料庫連接池、Redis連接池和HTTP連接池等)通過復用TCP連接來減少創建和釋放連接的時間。線程池通過復用線程提升性能。