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

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

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

問題?

在很多公司(如阿里、華為等)的編程規(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(核心線程數(shù))=maximumPoolSize(最大線程數(shù))。
  • LinkedBlockingQueue是一個無界隊列,如果提交的任務(wù)過快會造成任務(wù)大量的的堆積,消耗完服務(wù)器資源。
  • 如果隊列很大,很有可能導(dǎo)致JVM出現(xiàn)OOM(Out Of Memory)異常,即內(nèi)存資源耗盡。

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);
    }

嘗試修改核心線程數(shù)

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());
        //設(shè)置核心線程數(shù)
        threadPoolExecutor.setCorePoolSize(8);
        //創(chuàng)建一個單線程化的線程池
        ExecutorService singleExecutorService =
                Executors.newSingleThreadExecutor();
        //轉(zhuǎn)換成普通線程池,會拋出運行時異常 java.lang.ClassCastException
        ((ThreadPoolExecutor) singleExecutorService).setCorePoolSize(8);
    }
}

我們可以看出:

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

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標(biāo)準(zhǔn)構(gòu)造器創(chuàng)建一個核心線程數(shù)為0、最大線程數(shù)不設(shè)限制的線程池
  • 理論上可緩存線程池可以擁有無數(shù)個工作線程,即線程數(shù)量幾乎無限制。
  • 可緩存線程池的workQueue為SynchronousQueue同步隊列,這個隊列類似于一個接力棒,入隊出隊必須同時傳遞,正因為可緩存線程池可以無限制地創(chuàng)建線程,不會有任務(wù)等待,所以才使用SynchronousQueue。
  • 但是,maximumPoolSize的值為Integer.MAX_VALUE(非常大),可以認(rèn)為可以無限創(chuàng)建線程,如果任務(wù)提交較多,就會造成大量的線程被啟動,很有可能造成OOM異常,甚至導(dǎo)致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,表示線程數(shù)不設(shè)上限,其workQueue為一個DelayedWorkQueue實例,這是一個按到期時間升序排序的阻塞隊列。

1.5 總結(jié)

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

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

相關(guān)文章

  • Springboot集成GraphicsMagick

    Springboot集成GraphicsMagick

    本文主要是教大家如何將GraphicsMagick命令行工具集成到Springboot項目中,便可以使用Java進(jìn)行圖片處理相關(guān)開發(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 中使用數(shù)組存儲和操作數(shù)據(jù)

    Java 中使用數(shù)組存儲和操作數(shù)據(jù)

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

    Java中的關(guān)鍵字synchronized 詳解

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

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

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

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

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

    PostMan傳@RequestParam修飾的數(shù)組方式

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

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

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

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

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

最新評論

潮州市| 正宁县| 娱乐| 安阳县| 东港市| 岫岩| 镇原县| 隆昌县| 惠水县| 海阳市| 龙南县| 台中县| 万盛区| 和林格尔县| 桐乡市| 定陶县| 获嘉县| 娄底市| 邳州市| 石门县| 丰都县| 吴堡县| 麟游县| 东乌珠穆沁旗| 麟游县| 惠水县| 遵义市| 大渡口区| 莎车县| 兴仁县| 铅山县| 凌源市| 庄河市| 嘉鱼县| 上杭县| 银川市| 东乡| 东莞市| 藁城市| 永善县| 韶关市|