日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

Java為什么不建議使用Executors來創建線程池呢?

來源: 責編: 時間:2024-02-29 14:42:37 236觀看
導讀我們都知道在面試的過程中,關于線程池的問題,一直都是面試官比較注重的考點,現在也不會有面試官會選擇去問創建線程都有哪些方式了,而更多的實惠關注到如何去使用線程池,今天了不起就來和大家說說線程池。Java創建線程池方

我們都知道在面試的過程中,關于線程池的問題,一直都是面試官比較注重的考點,現在也不會有面試官會選擇去問創建線程都有哪些方式了,而更多的實惠關注到如何去使用線程池,今天了不起就來和大家說說線程池。p1v28資訊網——每日最新資訊28at.com

Java創建線程池方式

在Java中,創建線程池主要使用java.util.concurrent包下的Executors類。這個類提供了幾種靜態工廠方法,用于創建和管理不同類型的線程池。以下是一些常見的創建線程池的方式:p1v28資訊網——每日最新資訊28at.com

1.Fixed Thread Pool(固定線程池)

  • 創建一個可重用固定線程數的線程池,以共享的無界隊列方式來運行這些線程。在任意點,在大多數 nThreads 線程會處于處理任務的活動狀態。如果在所有線程處于活動狀態時提交附加任務,則在有可用線程之前,附加任務將在隊列中等待。
  • 創建方法:Executors.newFixedThreadPool(int nThreads)

2.Cached Thread Pool(緩存線程池)

  • 創建一個可根據需要創建新線程的線程池,但是在以前構造的線程可用時將重用它們。對于執行很多短期異步任務的程序而言,這些線程池通常可提高程序性能。調用 execute 將重用以前構造的線程(如果線程可用)。如果現有線程沒有可用的,則創建一個新線程并添加到池中。終止并從緩存中移除那些已有 60 秒鐘未被使用的線程。
  • 創建方法:Executors.newCachedThreadPool()

3.Single Thread Executor(單線程執行器)

  • 創建一個使用單個工作線程的 Executor,以無界隊列方式來運行該線程。(注意,如果單個線程始終因為等待新任務而處于非活動狀態,則在現行線程終止之前,它可能無法終止。)但是,如果線程因為失敗而終止,那么會有一個新的線程來替代它。單個線程的優勢在于,你無需處理對線程生命周期的管理。
  • 創建方法:Executors.newSingleThreadExecutor()

4.Scheduled Thread Pool(計劃線程池)

  • 創建一個線程池,它可安排在給定延遲后運行命令或者定期地執行。
  • 創建方法:Executors.newScheduledThreadPool(int corePoolSize)

5.自定義線程池

除了使用Executors類提供的靜態工廠方法創建線程池外,還可以通過實例化ThreadPoolExecutor類來自定義線程池。這種方式提供了更多的靈活性,允許你設置線程池的核心參數,如核心線程數、最大線程數、線程存活時間、任務隊列等。p1v28資訊網——每日最新資訊28at.com

示例代碼:p1v28資訊網——每日最新資訊28at.com

import java.util.concurrent.*;    public class CustomThreadPool {      public static void main(String[] args) {          int corePoolSize = 5;          int maximumPoolSize = 10;          long keepAliveTime = 60L;          TimeUnit unit = TimeUnit.SECONDS;          BlockingQueue<Runnable> workQueue = new LinkedBlockingQueue<>();          ThreadFactory threadFactory = Executors.defaultThreadFactory();          RejectedExecutionHandler handler = new ThreadPoolExecutor.AbortPolicy();            ThreadPoolExecutor executor = new ThreadPoolExecutor(                  corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, threadFactory, handler);            // 使用線程池執行任務...      }  }

非自定義線程池的缺點

我們先來看看 Executors 當中的幾個方法,也就是上面了不起給大家寫的除了自定義線程池的幾個方法。p1v28資訊網——每日最新資訊28at.com

public static ExecutorService newFixedThreadPool(int nThreads) {        return new ThreadPoolExecutor(nThreads, nThreads,                                      0L, TimeUnit.MILLISECONDS,                                      new LinkedBlockingQueue<Runnable>());    }

在源碼中有一個類,我們明顯的看到了隊列的身影,那就是 LinkedBlockingQueue。p1v28資訊網——每日最新資訊28at.com

它實現了一個基于鏈接節點的可選容量的阻塞隊列。此隊列按 FIFO(先進先出)排序元素。隊列的頭部是在隊列中存在時間最長的元素,隊列的尾部是在隊列中存在時間最短的元素。新元素總是插入到隊列的尾部,而檢索操作(如 take 和 poll)總是從隊列的頭部開始。p1v28資訊網——每日最新資訊28at.com

LinkedBlockingQueue 是一個線程安全的隊列,它內部使用了鎖和條件變量來保證多線程環境下的正確性和一致性。因為它是阻塞隊列,所以它可以用于生產者和消費者模型,在生產者線程和消費者線程之間傳遞數據。p1v28資訊網——每日最新資訊28at.com

LinkedBlockingQueue 的主要特點就幾個p1v28資訊網——每日最新資訊28at.com

  • 容量可選
  • 阻塞操作
  • 非阻塞操作
  • 線程安全
  • 高效的并發性能

為什么說容量可選呢?因為我們如果單獨使用這個LinkedBlockingQueue 那么你可以在創建 LinkedBlockingQueue 時指定一個容量,這將限制隊列中可以存儲的元素數量。如果未指定容量,則隊列的容量將是 Integer.MAX_VALUE。當隊列滿時,任何嘗試插入元素的線程都將被阻塞,直到隊列中有空間可用。p1v28資訊網——每日最新資訊28at.com

而阻塞操作則是他提供了阻塞的 put 和 take 方法。put 方法用于添加元素到隊列中,如果隊列已滿,則調用線程將被阻塞直到隊列有空閑空間。take 方法用于從隊列中移除并返回頭部元素,如果隊列為空,則調用線程將被阻塞直到隊列中有元素可用。p1v28資訊網——每日最新資訊28at.com

public void put(E e) throws InterruptedException {        if (e == null) throw new NullPointerException();        // Note: convention in all put/take/etc is to preset local var        // holding count negative to indicate failure unless set.        int c = -1;        Node<E> node = new Node<E>(e);        final ReentrantLock putLock = this.putLock;        final AtomicInteger count = this.count;        ......        public E take() throws InterruptedException {        E x;        int c = -1;        final AtomicInteger count = this.count;        final ReentrantLock takeLock = this.takeLock;        takeLock.lockInterruptibly();        try {            while (count.get() == 0) {                notEmpty.await();            }            x = dequeue();            c = count.getAndDecrement();            if (c > 1).....

我們看一個使用LinkedBlockingQueue的示例:p1v28資訊網——每日最新資訊28at.com

import java.util.concurrent.BlockingQueue;  import java.util.concurrent.LinkedBlockingQueue;    public class ProducerConsumerExample {      public static void main(String[] args) throws InterruptedException {          BlockingQueue<Integer> queue = new LinkedBlockingQueue<>(5);            Thread producer = new Thread(() -> {              try {                  for (int i = 0; i < 10; i++) {                      System.out.println("Produced: " + i);                      queue.put(i);                      Thread.sleep(200); // 模擬生產耗時                  }              } catch (InterruptedException e) {                  Thread.currentThread().interrupt();              }          });            Thread consumer = new Thread(() -> {              try {                  while (true) {                      Integer item = queue.take();                      System.out.println("Consumed: " + item);                      Thread.sleep(500); // 模擬消費耗時                  }              } catch (InterruptedException e) {                  Thread.currentThread().interrupt();              }          });            producer.start();          consumer.start();            producer.join();          // 注意:這里的 consumer 線程是一個無限循環,所以它不會自然結束。          // 在實際應用中,你需要有一個明確的停止條件來結束消費者線程。      }  }

說到這里感覺說多了,我們回歸正題,如果我們使用標準的 newCachedThreadPool 方法,如果線程數設置和任務數不能夠配合起來,就比如說設置的線程數是一定的,這個時候,任務數量越多,就會慢慢的進入到隊列LinkedBlockingQueue中,隊列的話,任務越多,占用的內存越多,最終就非常容易耗盡內存,導致OOM。p1v28資訊網——每日最新資訊28at.com

所以我們不推薦直接使用 Executors 來創建線程池,但是我們更推薦使用 ThreadpoolExecutor創建線程池。原因就是如下的幾點:p1v28資訊網——每日最新資訊28at.com

1.資源控制:ThreadPoolExecutor 允許你明確控制并發線程的最大數量,防止因為創建過多的線程而耗盡系統資源。通過合理地設置線程池的大小,可以平衡資源利用率和系統性能。p1v28資訊網——每日最新資訊28at.com

2.線程復用:線程池中的線程可以被多個任務復用,這減少了在創建和銷毀線程上花費的時間以及開銷,提高了系統的響應速度。p1v28資訊網——每日最新資訊28at.com

3.任務隊列:ThreadPoolExecutor 內部維護了一個任務隊列,當線程池中的線程都在工作時,新提交的任務會被放在隊列中等待執行。這提供了一種緩沖機制,可以平滑處理突發的高并發任務。p1v28資訊網——每日最新資訊28at.com

4.靈活性:ThreadPoolExecutor 提供了多種配置選項,如核心線程數、最大線程數、線程存活時間、任務隊列類型等,這些選項可以根據具體的應用場景進行調整,以達到最佳的性能和資源利用率。p1v28資訊網——每日最新資訊28at.com

5.異常處理:當線程池中的線程因為未捕獲的異常而終止時,ThreadPoolExecutor 會創建一個新的線程來替代它,從而保持線程池的穩定性。此外,你也可以通過提供自定義的 ThreadFactory 來控制線程的創建過程,例如設置線程的名稱、優先級、守護狀態等。p1v28資訊網——每日最新資訊28at.com

6.可擴展性:ThreadPoolExecutor 的設計是基于策略的,它使用了多個接口和抽象類來定義線程池的行為,這使得它很容易通過擴展或替換某些組件來適應不同的需求。p1v28資訊網——每日最新資訊28at.com

7.與Java并發庫集成:ThreadPoolExecutor 是 Java 并發庫 java.util.concurrent 的一部分,這個庫提供了豐富的并發工具和類,如鎖、信號量、倒計時器、阻塞隊列等,這些都可以與 ThreadPoolExecutor 無縫集成,簡化多線程編程的復雜性。p1v28資訊網——每日最新資訊28at.com

8.性能監控和調優:ThreadPoolExecutor 提供了一些有用的方法,如 getTaskCount()、getCompletedTaskCount()、getPoolSize() 等,這些方法可以幫助你監控線程池的運行狀態,從而進行性能調優。p1v28資訊網——每日最新資訊28at.com

所以你了解了么?p1v28資訊網——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-75332-0.htmlJava為什么不建議使用Executors來創建線程池呢?

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 使用ConfuserEx代碼混淆工具保護你的.NET應用程序

下一篇: 在Golang中簡化日志記錄:提升性能和調試效率

標簽:
  • 熱門焦點
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
一本色道久久88综合亚洲精品ⅰ| 免费短视频成人日韩| 亚洲乱码精品一二三四区日韩在线 | 久久精品国产91精品亚洲| 久久久久久亚洲精品不卡4k岛国| 久久综合中文| 欧美日韩亚洲免费| 国产精品久久网站| 韩国一区电影| 亚洲欧洲免费视频| 亚洲免费在线观看| 开心色5月久久精品| 欧美日韩亚洲视频一区| 国产欧美日韩综合| 最近看过的日韩成人| 亚洲主播在线播放| 另类成人小视频在线| 欧美三级网页| 国内精品久久久久久| 亚洲精品视频啊美女在线直播| 亚洲欧洲99久久| 欧美v日韩v国产v| 国产精品视频免费在线观看| 在线电影国产精品| 亚洲一级电影| 免费成人高清视频| 国产精品久久久久免费a∨大胸| 激情伊人五月天久久综合| 日韩一二在线观看| 久久九九国产| 国产精品福利在线| 亚洲国产欧美不卡在线观看| 亚洲女人天堂成人av在线| 女女同性精品视频| 国产一区二区三区四区在线观看 | 欧美激情亚洲国产| 国产一区免费视频| 中文无字幕一区二区三区| 久久久噜噜噜久久人人看| 欧美四级在线| 亚洲精品1区| 久久久久一本一区二区青青蜜月| 欧美日韩在线播放一区| 亚洲高清视频在线观看| 久久精品二区| 国产精品亚洲аv天堂网| 亚洲人午夜精品| 久久久久久久久综合| 国产精品日日摸夜夜添夜夜av| 亚洲区免费影片| 久久综合九色综合久99| 国产一区二区高清不卡| 亚洲永久免费av| 欧美日韩和欧美的一区二区| 亚洲第一综合天堂另类专| 欧美在线播放视频| 国产精品欧美日韩| 一区二区免费在线视频| 欧美激情精品久久久六区热门| 好看的av在线不卡观看| 欧美一区二区三区四区在线观看地址| 欧美午夜视频在线观看| 亚洲乱码国产乱码精品精天堂| 蜜桃久久精品一区二区| 韩国三级电影久久久久久| 欧美一区亚洲一区| 国产精品网红福利| 亚洲免费一级电影| 国产精品国产三级国产aⅴ浪潮 | 欧美丰满高潮xxxx喷水动漫| 精品1区2区3区4区| 久久久久欧美精品| 黄色工厂这里只有精品| 欧美在线视频不卡| 国产亚洲欧美日韩美女| 欧美在线免费| 国产一区二区三区视频在线观看| 性欧美长视频| 国产欧美一区二区三区久久| 亚洲欧美韩国| 国产精品专区一| 欧美一激情一区二区三区| 国产精品免费一区二区三区在线观看 | 99视频超级精品| 欧美黄色aaaa| 亚洲日韩欧美视频| 欧美经典一区二区三区| 亚洲精品乱码久久久久久久久 | 亚洲一区免费视频| 国产精品人人做人人爽| 亚洲欧美999| 国产欧美精品在线| 久久精品日韩| 在线欧美福利| 欧美激情精品久久久久久黑人| 亚洲精品国产视频| 欧美日韩亚洲国产一区| 亚洲视频精选| 国产欧美日韩不卡免费| 久久久精品午夜少妇| 1769国产精品| 欧美日韩国产二区| 亚洲一区二区三区免费在线观看| 国产精品福利久久久| 欧美一级专区| 亚洲国产另类精品专区| 欧美日韩国内| 欧美有码视频| 亚洲高清色综合| 欧美日韩18| 午夜天堂精品久久久久| 激情五月婷婷综合| 欧美精品九九| 亚洲欧美在线磁力| 激情小说另类小说亚洲欧美 | 国产农村妇女毛片精品久久麻豆 | 欧美日韩情趣电影| 亚洲综合日韩中文字幕v在线| 国产日韩精品在线播放| 麻豆精品精品国产自在97香蕉| 亚洲精品影视在线观看| 国产精品久久久久久久午夜片| 久久国产精品色婷婷| 91久久久久久国产精品| 国产精品久久久久77777| 久久久噜噜噜久久人人看| 亚洲三级影院| 国产精品自拍三区| 欧美成人一区二区三区| 亚洲综合日韩在线| 韩国欧美一区| 欧美日韩免费观看一区三区| 欧美一级视频精品观看| 亚洲国产欧美精品| 国产精品视频yy9299一区| 久久综合网色—综合色88| 在线视频一区观看| 精品成人在线| 欧美特黄一级大片| 久久久久久久久一区二区| 亚洲视频在线观看一区| 在线观看欧美| 国产精品系列在线播放| 欧美韩日一区二区| 欧美在线观看网址综合| 99视频一区二区三区| 国产一区二区久久精品| 欧美日韩精品一区二区三区四区| 久久精品国产久精国产思思| av成人手机在线| 伊人久久综合97精品| 国产精品成人午夜| 美女网站久久| 欧美在线观看视频在线| 一本到12不卡视频在线dvd| 伊人久久成人| 国产亚洲欧美日韩日本| 欧美少妇一区| 欧美高清视频一区二区三区在线观看| 欧美一级理论性理论a| 在线亚洲自拍| 在线不卡a资源高清| 国产精品一区二区在线| 欧美涩涩网站| 欧美精品免费观看二区| 久久蜜桃精品| 久久大逼视频| 亚洲欧美日韩国产综合精品二区| 亚洲理伦电影| 亚洲国产va精品久久久不卡综合| 国产日韩欧美高清| 国产精品毛片| 欧美色欧美亚洲另类二区| 欧美高清不卡| 蜜臀久久久99精品久久久久久| 久久超碰97中文字幕| 亚洲欧美精品一区| 亚洲午夜国产一区99re久久 | 久久国产99| 午夜影院日韩| 亚洲一品av免费观看| 日韩午夜免费视频| 亚洲国产一区二区三区高清| 狠狠综合久久| 国产亚洲精久久久久久| 国产精品免费看久久久香蕉| 欧美色网在线| 欧美日韩国产成人| 欧美日本韩国一区| 欧美精品一区二区三区蜜桃| 欧美~级网站不卡| 欧美超级免费视 在线| 快she精品国产999| 久久露脸国产精品| 久久久久久久综合| 久久精品国产久精国产思思| 欧美诱惑福利视频| 久久国产乱子精品免费女| 久久成人资源| 久久久久久穴| 久久在线视频在线| 久久综合给合久久狠狠色 | 免费不卡在线视频| 欧美国产日本高清在线|