日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

談談Java 線程池

瀏覽:24日期:2022-08-26 09:51:37

一、引言

池的概念大家并不陌生,數據庫連接池、線程池等...大體來說,有三個優點:

降低資源消耗。 提高響應速度。 便于統一管理。

以上是 “池化” 技術的相同特點,至于他們之間的不同點這里不講,兩者都是為了提高性能和效率,拋開實際做連連看找不同,沒有意義。

同樣,類比于線程池來說:

降低資源消耗:

重復利用線程池中已經創建的線程,相比之下省去了線程創建和銷毀的性能消耗。

提高響應速度:

當有任務創建時,不必等待線程創建,可以立即執行。

便于統一管理:

使用線程池,可以對線程統一管理,對線程的執行狀態做統一監控。

二、線程池的使用

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

1、關鍵參數

corePoolSize 核心線程數

當向線程池中提交一個任務時,如果線程池中的線程數量小于核心線程數,即使存在空閑線程,也會新建一個線程來執行當前任務,直到線程數量大于或等于核心線程數。

maximunPoolSize 最大線程數

當任務隊列滿了,線程池中的線程數量小于最大線程數時,創建新線程執行任務。對于無界隊列,忽略該參數。

keepAliveTime 線程存活時間

大于核心線程數的那一部分線程的存活時間,如果這部分線程空閑超過這段時間,則進行銷毀。

workqueue 任務隊列

線程池中的線程數大于核心線程數時,將任務放入此隊列等待執行。

threadFactory 線程工廠

用于創建線程,工廠使用 new Threa() 的方式創建線程,并為每個線程做統一規則的命名:pool-m-thread-n(m為線程池的編號,n為線程池內的線程編號)。

handler 飽和策略

當線程池和隊列都滿了,則根據此策略處理任務。

2、任務隊列類型

名稱 描述 ArrayBlockingQueue 基于數組結構的有界阻塞隊列,此隊列按 FIFO(先進先出)原則對元素進行排序。 LinkedBlockingQueue 基于鏈表結構的阻塞隊列,此隊列按 FIFO (先進先出) 排序元素,吞吐量通常要高于 ArrayBlockingQueue。Executors.newFixedThreadPool( ) 使用了這個隊列。 SynchronousQueue 不存儲元素的阻塞隊列。每個插入操作必須等到另一個線程調用移除操作,否則插入操作一直處于阻塞狀態,吞吐量通常要高于 LinkedBlockingQueue,靜態工廠方法 Executors.newCachedThreadPool( ) 使用了這個隊列。 PriorityBlockingQueue 具有優先級的無限阻塞隊列。

3、飽和策略類型

策略名稱 特性 AbortPolicy 默認的飽和策略,直接拋出 RejectedExecutionException 異常 DiscardPolicy 不處理,直接丟棄任務 CallerRunsPolicy 使用調用者的線程執行任務 DiscardOldestPolicy 丟棄隊列里最近的一個任務,執行當前任務

同時,還可以自行實現 RejectedExecutionHandler 接口來自定義飽和策略,比如記錄日志、持久化等等。

void execute(Runnable command)

ThreadFactory namedThreadFactory =new ThreadFactoryBuilder().setNameFormat('demo-pool-%d').build();ExecutorService executor =new ThreadPoolExecutor(10, 1000,60L,TimeUnit.SECONDS,new LinkedBlockingQueue<>(10),namedThreadFactory,new ThreadPoolExecutor.AbortPolicy());executor.execute(() -> {System.out.println(1111);});

注意使用 execute 方法提交任務時,沒有返回值。

Future<?> submit(Runnable task)

Future<Integer> future = executor.submit(() -> { return 1 + 1; });Integer result = future.get();

還可以使用 submit 方法提交任務,該方法返回一個 Future 對象,通過 Future#get( ) 方法可以獲得任務的返回值,該方法會一直阻塞知道任務執行完畢。還可以使用 Future#get(long timeout, TimeUnit unit) 方法,該方法會阻塞一段時間后立即返回,而這時任務可能沒有執行完畢。

5、關閉線程池

ThreadPoolExecutor 提供了 shutdown( ) 和 shutdownNow( ) 兩個方法關閉線程池。原理是首先遍歷線程池的工作線程,依次調用 interrupt( ) 方法中斷線程,這樣看來如果無法響應中斷的任務就不能終止。

兩者區別是:

shutdownNow( )shutdown( )

如果調用了其中一種方法,isShutdown 方法就會返回 true。當所有的任務都已關閉后, 才表示線程池關閉成功,這時調用 isTerminaed 方法會返回 true。實際應用中可以根據任務是否 一定要執行完畢 的特性,決定使用哪種方法關閉線程池。

6、合理的配置線程池

通常我們可以 根據 CPU 核心數量來設計線程池數量 。

可以通過 Runtime.getRuntime().availableProcessors() 方法獲得當前設備的物理核心數量。值得注意的是,如果應用運行在一些 docker 或虛擬機容器上時,該方法取得的是當前物理機的 CPU 核心數。

IO 密集型 2nCPU 計算密集型 nCPU+1

其中 n 為 CPU 核心數量。

為什么加 1:即使當計算密集型的線程偶爾由于缺失故障或者其他原因而暫停時,這個額外的線程也能確保 CPU 的時鐘周期不會被浪費。

三、線程池的運行過程

談談Java 線程池

當提交一個新任務時,線程池的處理步驟:

判斷當前線程池內的線程數量是否小于核心線程數,如果小于則新建線程執行任務。否則,進入下個階段。 判斷隊列是否已滿,如果沒滿,則將任務加入等待隊列。否則,進入下個階段。 在上面基礎上判斷是否大于最大線程數,如果是根據響應的策略處理。否則,新建線程執行當前任務。

線程池的源碼比較簡單易懂,感興趣的小伙伴可以自行查看 java.util.concurrent.ThreadPoolExecutor ,在線程池中每個任務都被包裝為一個一個的 Worker ,下面簡單看下 Worker 的 run( ) 方法:

try { while (task != null || (task = getTask()) != null) {w.lock();// If pool is stopping, ensure thread is interrupted;// if not, ensure thread is not interrupted. This// requires a recheck in second case to deal with// shutdownNow race while clearing interruptif ((runStateAtLeast(ctl.get(), STOP) || (Thread.interrupted() && runStateAtLeast(ctl.get(), STOP))) && !wt.isInterrupted()) wt.interrupt();try { beforeExecute(wt, task); Throwable thrown = null; try { task.run(); } catch (RuntimeException x) { thrown = x; throw x; } catch (Error x) { thrown = x; throw x; } catch (Throwable x) { thrown = x; throw new Error(x); } finally { afterExecute(task, thrown); }} finally { task = null; w.completedTasks++; w.unlock();} } completedAbruptly = false; } finally { processWorkerExit(w, completedAbruptly); }

可以看到不斷的循環取出 Task 并執行,而在任務的執行前后,有 beforeExecute 和 afterExecute 方法,我們可以實現兩個方法實現一些監控邏輯。除此之外還可以集合線程池的一些屬性或者重寫 terminated() 方法在線程池關閉時進行監控。

四、常見的幾種線程池實現

在 Executors 中提供了集中常見的線程池,分別應用在不同的場景。

FixThreadPool 固定數量的線程池,適用于對線程管理,高負載的系統 SingleThreadPool 只有一個線程的線程池,適用于保證任務順序執行 CacheThreadPool 創建一個不限制線程數量的線程池,適用于執行短期異步任務的小程序,低負載系統 ScheduledThreadPool 定時任務使用的線程池,適用于定時任務

上面幾種線程池的特性主要依賴于 ThreadPoolExecutor 的幾個參數來實現,不同的核心線程數量,以及不同類型的阻塞隊列,同時我們還可以自行實現自己的線程池滿足業務需求。

值得注意的是,并不推薦使用 Executors 創建線程池,詳見下:

Executors.newFixedThreadPool(int nThread)

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

繼續來看 LinkedBlockingQueue :

public LinkedBlockingQueue() { this(Integer.MAX_VALUE);}public LinkedBlockingQueue(int capacity) { if (capacity <= 0) throw new IllegalArgumentException(); this.capacity = capacity; last = head = new Node<E>(null);}

可以看到使用 LinkedBlockingQueue 創建的是 Integer.MAX_VALUE 大小的隊列,會堆積大量的請求,從而造成 OOM

Executors.newSingleThreadExexutor( )

public static ExecutorService newSingleThreadExecutor() { return new FinalizableDelegatedExecutorService (new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>()));}

同樣,使用的 LinkedBlockingQueue ,一樣的情況

Executors.newCachedThreadPool( )

public static ExecutorService newCachedThreadPool() { return new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>());}

代碼課件線程池使用的最大線程數是 Integer.MAX_VALUE ,可能會創建大量線程,導致 OOM

Executors.newScheduleThreadPool()

public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) { return new ScheduledThreadPoolExecutor(corePoolSize);}public ScheduledThreadPoolExecutor(int corePoolSize) { super(corePoolSize, Integer.MAX_VALUE, 0, NANOSECONDS, new DelayedWorkQueue());}

和上面是一樣的問題,最大線程數是 Integer.MAX_VALUE所以原則上來說禁止使用 Executors 創建線程池, 而使用 ThreadPoolExecutor 的構造函數來創建線程池。

五、結語

線程池在開發中還是比較常見的,結合不同的業務場景,結合最佳實踐配置正確的參數,可以幫助我們的應用性能得到提升。

以上就是談談Java 線程池的詳細內容,更多關于Java 線程池的資料請關注好吧啦網其它相關文章!

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
精品久久一区| 美女在线视频一区| 桃色av一区二区| 青青国产精品| 在线一区二区三区视频| 久久久精品国产**网站| 国产精品扒开腿做爽爽爽软件| 在线一区欧美| 欧美va天堂| 亚洲女同中文字幕| 激情欧美一区| 香蕉成人av| 国产亚洲一区二区三区啪| 成人羞羞视频在线看网址| 国产黄色精品| 麻豆传媒一区二区三区| 精品三级久久久| 视频福利一区| 亚洲爱爱视频| 亚洲激情五月| 蜜臀av性久久久久蜜臀aⅴ流畅| 欧美特黄a级高清免费大片a级| 日韩中文欧美| 欧美成人高清| 综合欧美亚洲| 国产精品夜夜夜| 另类综合日韩欧美亚洲| 精品美女在线视频| 欧美亚洲国产激情| 蜜桃tv一区二区三区| 精品久久久久中文字幕小说| 69精品国产久热在线观看| 欧美偷窥清纯综合图区| 国产极品久久久久久久久波多结野 | 精品久久一区| 国内自拍视频一区二区三区| 色88888久久久久久影院| 伊人久久成人| 国产日韩一区二区三区在线 | 日韩专区一卡二卡| 久久国产精品亚洲77777| 一区福利视频| 亚洲成人精品| 影音先锋久久精品| 久久99久久久精品欧美| 日韩在线观看一区| 伊人精品在线| 国产精品一国产精品k频道56| 日韩啪啪电影网| 亚洲bt欧美bt精品777| 成人亚洲欧美| 热久久国产精品| 日本欧美不卡| 国产精品一二| 亚洲欧美高清| 国产一区二区三区精品在线观看| 久久婷婷丁香| 中文一区一区三区免费在线观 | 日韩 欧美一区二区三区| 日韩视频在线一区二区三区 | 中文字幕一区二区三区四区久久| 欧美午夜不卡| 亚洲涩涩av| 91久久亚洲| 日韩一级不卡| 色综合视频一区二区三区日韩 | 97精品97| 蜜桃久久久久| 一区二区三区四区日韩| 亚洲精品小说| 日韩精品欧美| 国产精品hd| 日本大胆欧美人术艺术动态| 亚洲成人av观看| 日韩在线视频精品| 国产精品精品| 国精品产品一区| 免费成人在线观看| 伊人久久亚洲美女图片| 国产成人精品福利| 国产激情综合| 欧美经典一区| 久久久91麻豆精品国产一区| 日韩va亚洲va欧美va久久| 日韩视频一区二区三区在线播放免费观看 | 偷拍欧美精品| 欧美不卡高清| 91久久久精品国产| 欧美理论视频| 三级在线观看一区二区| 亚洲一区欧美激情| 午夜在线视频观看日韩17c| 中文在线一区| 亚洲三区欧美一区国产二区| 日韩精品久久久久久久电影99爱| 动漫av一区| 国产aa精品| 久久青草久久| 免播放器亚洲| 日韩三级一区| 久久久久久一区二区| 老牛国产精品一区的观看方式| 亚洲视频二区| 欧美精品第一区| 欧洲激情综合| 91精品福利| 日韩黄色在线观看| 美女视频黄免费的久久| 国产日韩一区二区三免费高清 | 少妇精品久久久| 亚洲成av人片一区二区密柚| 日韩高清不卡一区二区| 日韩精品欧美成人高清一区二区| 精品国内亚洲2022精品成人| 久久美女精品| 欧美伊人久久| 国产传媒在线| 日本va欧美va精品发布| 香蕉视频成人在线观看| 欧美91在线|欧美| 日韩在线网址| 性色av一区二区怡红| 亚洲国产一区二区在线观看| 亚洲精品在线影院| 欧美韩日一区| 另类专区亚洲| 红杏一区二区三区| 韩日一区二区| 国内精品美女在线观看| 国产日韩欧美三区| 国产无遮挡裸体免费久久| 91亚洲无吗| 久久一二三区| 综合色一区二区| 午夜久久av| 久久激情五月婷婷| 国产精品.xx视频.xxtv| 国产精品久久久久久久久久久久久久久 | 婷婷色综合网| 都市激情国产精品| 日韩精品视频网站| 国产亚洲永久域名| 免费黄色成人| 美女网站一区| 国产精品三上| 水蜜桃久久夜色精品一区的特点| 亚洲美女久久精品| 欧美综合精品| 亚洲一区欧美| 日韩精品诱惑一区?区三区| 精品视频99| 日韩电影免费网址| 樱桃视频成人在线观看| 国产一区福利| 日韩高清成人| 日韩av在线中文字幕| 国产成人黄色| 成人影视亚洲图片在线| 国产精品1区| 成人国产精品一区二区网站| 麻豆一区在线| 视频福利一区| 黄色亚洲免费| 日韩精品欧美成人高清一区二区| 日韩**一区毛片| 国产成人免费| 亚洲高清毛片| 99精品国产一区二区三区| 国产亚洲欧美日韩精品一区二区三区| 在线人成日本视频| 亚洲精品黄色| 免费人成在线不卡| 99精品视频在线观看免费播放| 精品精品99| 91一区二区| 成人台湾亚洲精品一区二区 | 99久久www免费| 久久国产主播| 美女少妇全过程你懂的久久| 久久裸体视频| 国产91一区| 电影亚洲精品噜噜在线观看| 黑森林国产精品av| 精品中文字幕一区二区三区四区| 成人精品天堂一区二区三区| 先锋影音久久久| 色一区二区三区| 青青青国产精品| 黑丝一区二区三区| 蜜桃av.网站在线观看| 欧美日韩网址| 久久国产66| 美女亚洲一区| 久久激情一区| 久久精品国内一区二区三区| 天堂久久一区| 在线观看一区| 亚洲精品888| 国产欧美一级| 亚洲女同一区|