最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

工作中禁止使用Executors快捷創(chuàng)建線程池原理詳解

 更新時間:2022年11月02日 08:58:58   作者:長安不及十里  
這篇文章主要為大家介紹了工作中禁止使用Executors快捷創(chuàng)建線程池原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

問題?

在很多公司(如阿里、華為等)的編程規(guī)范中,非常明確地禁止使用Executors快捷創(chuàng)建線程池,為什么呢?這里從源碼講起,介紹使用Executors工廠方法快捷創(chuàng)建線程池將會面臨的潛在問題。

1.1 newFixedThreadPool的潛在問題

基本使用

         // 線程池
        ExecutorService singleThreadExecutor = Executors.newFixedThreadPool(2);
        // 批量添加線程
        for (int i = 0; i < 7; i++) {
            singleThreadExecutor.execute(new TargetTask());
            //  singleThreadExecutor.submit(new TargetTask());
        }
        Thread.sleep(1000);
        // 線程池銷毀
        singleThreadExecutor.shutdown();;

查看源碼

  public static ExecutorService newFixedThreadPool(int nThreads) {
        return new ThreadPoolExecutor(nThreads, nThreads,
                                      0L, TimeUnit.MILLISECONDS,
                                      new LinkedBlockingQueue<Runnable>());
    }
    /**
     * Creates a {@code LinkedBlockingQueue} with a capacity of
     * {@link Integer#MAX_VALUE}.
     */
    public LinkedBlockingQueue() {
        this(Integer.MAX_VALUE);
    }

我們可以看出:

  • corePoolSize(核心線程數)=maximumPoolSize(最大線程數)。
  • LinkedBlockingQueue是一個無界隊列,如果提交的任務過快會造成任務大量的的堆積,消耗完服務器資源。
  • 如果隊列很大,很有可能導致JVM出現(xiàn)OOM(Out Of Memory)異常,即內存資源耗盡。

1.2 newSingleThreadExecutor的潛在問題?

基本使用

         // 線程池
        ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
        // 批量添加線程
        for (int i = 0; i < 5; i++) {
            singleThreadExecutor.execute(new TargetTask());
          //  singleThreadExecutor.submit(new TargetTask());
        }
        Thread.sleep(1000);
        // 線程池銷毀
        singleThreadExecutor.shutdown();;

查看源碼

    public static ExecutorService newSingleThreadExecutor() {
        return new FinalizableDelegatedExecutorService
            (new ThreadPoolExecutor(1, 1,
                                    0L, TimeUnit.MILLISECONDS,
                                    new LinkedBlockingQueue<Runnable>()));
    }
   /**
     * Creates a {@code LinkedBlockingQueue} with a capacity of
     * {@link Integer#MAX_VALUE}.
     */
    public LinkedBlockingQueue() {
        this(Integer.MAX_VALUE);
    }

嘗試修改核心線程數

package ExecutorDemo.newSingleThreadExecutor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
/**
 * @description:
 * @author: shu
 * @createDate: 2022/11/1 10:45
 * @version: 1.0
 */
public class UpdateSingleThreadExecutor {
    public static void main(String[] args) {
        //創(chuàng)建一個固定大小的線程池
        ExecutorService fixedExecutorService =
                Executors.newFixedThreadPool(1);
        ThreadPoolExecutor threadPoolExecutor =
                (ThreadPoolExecutor) fixedExecutorService;
        System.out.println(threadPoolExecutor.getMaximumPoolSize());
        //設置核心線程數
        threadPoolExecutor.setCorePoolSize(8);
        //創(chuàng)建一個單線程化的線程池
        ExecutorService singleExecutorService =
                Executors.newSingleThreadExecutor();
        //轉換成普通線程池,會拋出運行時異常 java.lang.ClassCastException
        ((ThreadPoolExecutor) singleExecutorService).setCorePoolSize(8);
    }
}

我們可以看出:

  • 單例存在,我們無法去修改核心線程數,否則會造成異常處理。
  • corePoolSize(核心線程數)=maximumPoolSize(最大線程數)=1 。
  • LinkedBlockingQueue是一個無界隊列,如果提交的任務過快會造成任務大量的的堆積,消耗完服務器資源。
  • 如果隊列很大,很有可能導致JVM出現(xiàn)OOM(Out Of Memory)異常,即內存資源耗盡。

1.3 newCachedThreadPool的潛在問題

基本使用

        // 線程池
        ExecutorService singleThreadExecutor = Executors.newCachedThreadPool();
        // 批量添加線程
        for (int i = 0; i < 7; i++) {
            singleThreadExecutor.execute(new TargetTask());
            //  singleThreadExecutor.submit(new TargetTask());
        }
        Thread.sleep(1000);
        // 線程池銷毀
        singleThreadExecutor.shutdown();;

源碼分析

    public static ExecutorService newCachedThreadPool() {
        return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
                                      60L, TimeUnit.SECONDS,
                                      new SynchronousQueue<Runnable>());
    }
     * Creates a {@code SynchronousQueue} with nonfair access policy.
     */
    public SynchronousQueue() {
        this(false);
    }
  • ThreadPoolExecutor標準構造器創(chuàng)建一個核心線程數為0、最大線程數不設限制的線程池
  • 理論上可緩存線程池可以擁有無數個工作線程,即線程數量幾乎無限制。
  • 可緩存線程池的workQueue為SynchronousQueue同步隊列,這個隊列類似于一個接力棒,入隊出隊必須同時傳遞,正因為可緩存線程池可以無限制地創(chuàng)建線程,不會有任務等待,所以才使用SynchronousQueue。
  • 但是,maximumPoolSize的值為Integer.MAX_VALUE(非常大),可以認為可以無限創(chuàng)建線程,如果任務提交較多,就會造成大量的線程被啟動,很有可能造成OOM異常,甚至導致CPU線程資源耗盡。

1.4 newScheduledThreadPool 潛在問題

基本使用

          // 線程池
        ScheduledExecutorService service = Executors.newScheduledThreadPool(2);
        // 批量添加線程
        for (int i = 0; i < 7; i++) {
            ScheduledFuture<?> future = service.scheduleWithFixedDelay(new TargetTask(), 0, 500, TimeUnit.MILLISECONDS);
        }
        Thread.sleep(1000);
        // 線程池銷毀
        service.shutdown();;

源碼分析

    public ScheduledThreadPoolExecutor(int corePoolSize) {
        super(corePoolSize, Integer.MAX_VALUE, 0, NANOSECONDS,
              new DelayedWorkQueue());
    }
 static class DelayedWorkQueue extends AbstractQueue<Runnable>
        implements BlockingQueue<Runnable> {
        private static final int INITIAL_CAPACITY = 16;
        private RunnableScheduledFuture<?>[] queue =
            new RunnableScheduledFuture<?>[INITIAL_CAPACITY];
        private final ReentrantLock lock = new ReentrantLock();
        private int size = 0;
        private Thread leader = null;
        private final Condition available = lock.newCondition();
        }

maximumPoolSize為Integer.MAX_VALUE,表示線程數不設上限,其workQueue為一個DelayedWorkQueue實例,這是一個按到期時間升序排序的阻塞隊列。

1.5 總結

雖然Executors工廠類提供了構造線程池的便捷方法,但是對于服務器程序而言,大家應該杜絕使用這些便捷方法,而是直接使用線程池ThreadPoolExecutor的構造器,從而有效避免由于使用無界隊列可能導致的內存資源耗盡,或者由于對線程

以上就是工作中禁止使用Executors快捷創(chuàng)建線程池原理詳解的詳細內容,更多關于禁止用Executors創(chuàng)建線程池的資料請關注腳本之家其它相關文章!

相關文章

  • Springboot集成GraphicsMagick

    Springboot集成GraphicsMagick

    本文主要是教大家如何將GraphicsMagick命令行工具集成到Springboot項目中,便可以使用Java進行圖片處理相關開發(fā)。
    2021-05-05
  • Mybatis中如何映射mysql中的JSON字段

    Mybatis中如何映射mysql中的JSON字段

    在mapper.xml中,需要在字段映射時加入typeHandler,具體:<id?property="abnormalEigenList"?column="AbnormalEigen"?typeHandler="com.xxx.config.JsonHandler">,下面通過本文給大家介紹Mybatis中,映射mysql中的JSON字段,需要的朋友可以參考下
    2023-10-10
  • idea中@Autowired注解下變量報紅的解決

    idea中@Autowired注解下變量報紅的解決

    這篇文章主要介紹了idea中@Autowired注解下變量報紅的解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Java 中使用數組存儲和操作數據

    Java 中使用數組存儲和操作數據

    本文將介紹Java中常用的數組操作方法,通過詳細的示例和解釋,幫助讀者全面理解和掌握這些方法,具有一定的參考價值,感興趣的可以了解一下
    2023-09-09
  • Java中的關鍵字synchronized 詳解

    Java中的關鍵字synchronized 詳解

    這篇文章主要介紹了Java中的關鍵字synchronized,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-03-03
  • spring boot下 500 404 錯誤頁面處理的方法

    spring boot下 500 404 錯誤頁面處理的方法

    本篇文章主要介紹了spring boot下 500 404 錯誤頁面處理的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • Java11中基于嵌套關系的訪問控制優(yōu)化詳解

    Java11中基于嵌套關系的訪問控制優(yōu)化詳解

    Java(和其他語言)通過內部類支持嵌套類,要使其正常工作,需要編譯器執(zhí)行一些技巧,下面這篇文章主要給大家介紹了關于Java11中基于嵌套關系的訪問控制優(yōu)化的相關資料,需要的朋友可以參考下
    2022-01-01
  • PostMan傳@RequestParam修飾的數組方式

    PostMan傳@RequestParam修飾的數組方式

    這篇文章主要介紹了PostMan傳@RequestParam修飾的數組方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • SpringBoot?的?web?類型推斷詳解

    SpringBoot?的?web?類型推斷詳解

    這篇文章主要介紹了SpringBoot?的?web?類型推斷詳解的相關資料,需要的朋友可以參考下
    2022-12-12
  • Spring基于xml實現(xiàn)自動裝配流程詳解

    Spring基于xml實現(xiàn)自動裝配流程詳解

    自動裝配是使用spring滿足bean依賴的一種方法,spring會在應用上下文中為某個bean尋找其依賴的bean,Spring中bean有三種裝配機制,分別是:在xml中顯式配置、在java中顯式配置、隱式的bean發(fā)現(xiàn)機制和自動裝配
    2023-01-01

最新評論

鹿邑县| 海丰县| 鹤壁市| 元江| 宾阳县| 湖北省| 岳池县| 元朗区| 日照市| 宜章县| 长汀县| 长岛县| 广宁县| 泰兴市| 句容市| 青海省| 望奎县| 昭苏县| 皮山县| 上思县| 方城县| 定陶县| 城市| 丰城市| 天水市| 大理市| 宜黄县| 登封市| 静安区| 蕲春县| 柘荣县| 闽侯县| 黔江区| 灵寿县| 新闻| 永吉县| 太仆寺旗| 苗栗县| 静安区| 扬中市| 文安县|