亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁技術(shù)文章
文章詳情頁

JAVA 自定義線程池的最大線程數(shù)設(shè)置方法

瀏覽:2日期:2022-08-30 11:41:39

一:CPU密集型:

定義:CPU密集型也是指計算密集型,大部分時間用來做計算邏輯判斷等CPU動作的程序稱為CPU密集型任務(wù)。該類型的任務(wù)需要進(jìn)行大量的計算,主要消耗CPU資源。 這種計算密集型任務(wù)雖然也可以用多任務(wù)完成,但是任務(wù)越多,花在任務(wù)切換的時間就越多,CPU執(zhí)行任務(wù)的效率就越低,所以,要最高效地利用CPU,計算密集型任務(wù)同時進(jìn)行的數(shù)量應(yīng)當(dāng)?shù)扔贑PU的核心數(shù)。

特點(diǎn):

01:CPU 使用率較高(也就是經(jīng)常計算一些復(fù)雜的運(yùn)算,邏輯處理等情況)非常多的情況下使用

02:針對單臺機(jī)器,最大線程數(shù)一般只需要設(shè)置為CPU核心數(shù)的線程個數(shù)就可以了

03:這一類型多出現(xiàn)在開發(fā)中的一些業(yè)務(wù)復(fù)雜計算和邏輯處理過程中。

代碼示例:

package pool;import java.util.concurrent.Executors;import java.util.concurrent.LinkedBlockingDeque;import java.util.concurrent.ThreadPoolExecutor;import java.util.concurrent.TimeUnit;public class Demo02 { public static void main(String[] args) { //自定義線程池! 工作中只會使用 ThreadPoolExecutor /** * 最大線程該如何定義(線程池的最大的大小如何設(shè)置!) * 1、CPU 密集型,幾核,就是幾,可以保持CPU的效率最高! */ //獲取電腦CPU核數(shù) System.out.println(Runtime.getRuntime().availableProcessors()); //8核 ThreadPoolExecutor threadPool = new ThreadPoolExecutor( 2, //核心線程池大小 Runtime.getRuntime().availableProcessors(), //最大核心線程池大小(CPU密集型,根據(jù)CPU核數(shù)設(shè)置) 3, //超時了沒有人調(diào)用就會釋放 TimeUnit.SECONDS,//超時單位 new LinkedBlockingDeque<>(3), //阻塞隊列 Executors.defaultThreadFactory(), //線程工廠,創(chuàng)建線程的,一般不用動 new ThreadPoolExecutor.AbortPolicy()); //銀行滿了,還有人進(jìn)來,不處理這個人的,拋出異常 try { //最大承載數(shù),Deque + Max (隊列線程數(shù)+最大線程數(shù)) //超出 拋出 RejectedExecutionException 異常 for (int i = 1; i <= 9; i++) { //使用了線程池之后,使用線程池來創(chuàng)建線程 threadPool.execute(()->{ System.out.println(Thread.currentThread().getName()+' ok'); }); } } catch (Exception e) { e.printStackTrace(); } finally { //線程池用完,程序結(jié)束,關(guān)閉線程池 threadPool.shutdown(); //(為確保關(guān)閉,將關(guān)閉方法放入到finally中) } }}

二:IO密集型:

定義:IO密集型任務(wù)指任務(wù)需要執(zhí)行大量的IO操作,涉及到網(wǎng)絡(luò)、磁盤IO操作,對CPU消耗較少,其消耗的主要資源為IO。

我們所接觸到的 IO ,大致可以分成兩種:磁盤 IO和網(wǎng)絡(luò) IO。

01:磁盤 IO ,大多都是一些針對磁盤的讀寫操作,最常見的就是文件的讀寫,假如你的數(shù)據(jù)庫、 Redis 也是在本地的話,那么這個也屬于磁盤 IO。

02:網(wǎng)絡(luò) IO ,這個應(yīng)該是大家更加熟悉的,我們會遇到各種網(wǎng)絡(luò)請求,比如 http 請求、遠(yuǎn)程數(shù)據(jù)庫讀寫、遠(yuǎn)程 Redis 讀寫等等。

  IO 操作的特點(diǎn)就是需要等待,我們請求一些數(shù)據(jù),由對方將數(shù)據(jù)寫入緩沖區(qū),在這段時間中,需要讀取數(shù)據(jù)的線程根本無事可做,因此可以把 CPU 時間片讓出去,直到緩沖區(qū)寫滿。

既然這樣,IO 密集型任務(wù)其實(shí)就有很大的優(yōu)化空間了(畢竟存在等待):

 CPU 使用率較低,程序中會存在大量的 I/O 操作占用時間,導(dǎo)致線程空余時間很多,所以通常就需要開CPU核心數(shù)兩倍的線程。當(dāng)線程進(jìn)行 I/O 操作 CPU 空閑時,線程等待時間所占比例越高,就需要越多線程,啟用其他線程繼續(xù)使用 CPU,以此提高 CPU 的使用率;線程 CPU 時間所占比例越高,需要越少的線程,這一類型在開發(fā)中主要出現(xiàn)在一些計算業(yè)務(wù)頻繁的邏輯中。

代碼示例:

package pool;import java.util.concurrent.Executors;import java.util.concurrent.LinkedBlockingDeque;import java.util.concurrent.ThreadPoolExecutor;import java.util.concurrent.TimeUnit;public class Demo02 { public static void main(String[] args) { //自定義線程池! 工作中只會使用 ThreadPoolExecutor /** * 最大線程該如何定義(線程池的最大的大小如何設(shè)置!) * 2、IO 密集型 >判斷你程序中十分耗IO的線程 * 程序 15個大型任務(wù) io十分占用資源! (最大線程數(shù)設(shè)置為30) * 設(shè)置最大線程數(shù)為十分耗io資源線程個數(shù)的2倍 */ //獲取電腦CPU核數(shù) System.out.println(Runtime.getRuntime().availableProcessors()); //8核 ThreadPoolExecutor threadPool = new ThreadPoolExecutor( 2,//核心線程池大小 16, //若一個IO密集型程序有15個大型任務(wù)且其io十分占用資源!(最大線程數(shù)設(shè)置為 2*CPU 數(shù)目) 3,//超時了沒有人調(diào)用就會釋放 TimeUnit.SECONDS, //超時單位 new LinkedBlockingDeque<>(3), //阻塞隊列 Executors.defaultThreadFactory(), //線程工廠,創(chuàng)建線程的,一般不用動 new ThreadPoolExecutor.DiscardOldestPolicy()); //隊列滿了,嘗試和最早的競爭,也不會拋出異常 try { //最大承載數(shù),Deque + Max (隊列線程數(shù)+最大線程數(shù)) //超出 拋出 RejectedExecutionException 異常 for (int i = 1; i <= 9; i++) { //使用了線程池之后,使用線程池來創(chuàng)建線程 threadPool.execute(()->{ System.out.println(Thread.currentThread().getName()+' ok'); }); } } catch (Exception e) { e.printStackTrace(); } finally { //線程池用完,程序結(jié)束,關(guān)閉線程池 threadPool.shutdown(); //(為確保關(guān)閉,將關(guān)閉方法放入到finally中) } }}

接下來我們進(jìn)行一一分析:

1:高并發(fā)、任務(wù)執(zhí)行時間短的業(yè)務(wù),線程池線程數(shù)可以設(shè)置為CPU核數(shù)+1,減少線程上下文的切換

2:并發(fā)不高、任務(wù)執(zhí)行時間長的業(yè)務(wù)這就需要區(qū)分開看了:

a)假如是業(yè)務(wù)時間長集中在IO操作上,也就是IO密集型的任務(wù),因為IO操作并不占用CPU,所以不要讓所有的CPU閑下來,可以適當(dāng)加大線程池中的線程數(shù)目,讓CPU處理更多的業(yè)務(wù)

b)假如是業(yè)務(wù)時間長集中在計算操作上,也就是計算密集型任務(wù),這個就沒辦法了,線程池中的線程數(shù)設(shè)置得少一些,減少線程上下文的切換

(其實(shí)從一二可以看出無論并發(fā)高不高,對于業(yè)務(wù)中是否是cpu密集還是I/O密集的判斷都是需要的當(dāng)前前提是你需要優(yōu)化性能的前提下)

3:并發(fā)高、業(yè)務(wù)執(zhí)行時間長,解決這種類型任務(wù)的關(guān)鍵不在于線程池而在于整體架構(gòu)的設(shè)計,看看這些業(yè)務(wù)里面某些數(shù)據(jù)是否能做緩存是第一步,我們的項目使用的時redis作為緩存(這類非關(guān)系型數(shù)據(jù)庫還是挺好的)。增加服務(wù)器是第二步(一般政府項目的首先,因為不用對項目技術(shù)做大改動,求一個穩(wěn),但前提是資金充足),至于線程池的設(shè)置,設(shè)置參考 2 。最后,業(yè)務(wù)執(zhí)行時間長的問題,也可能需要分析一下,看看能不能使用中間件(任務(wù)時間過長的可以考慮拆分邏輯放入隊列等操作)對任務(wù)進(jìn)行拆分和解耦。

三.:總結(jié):

01:一個計算為主的程序(CPU密集型程序),多線程跑的時候,可以充分利用起所有的 CPU 核心數(shù),比如說 8 個核心的CPU ,開8 個線程的時候,可以同時跑 8 個線程的運(yùn)算任務(wù),此時是最大效率。但是如果線程遠(yuǎn)遠(yuǎn)超出 CPU 核心數(shù)量,反而會使得任務(wù)效率下降,因為頻繁的切換線程也是要消耗時間的。因此對于 CPU 密集型的任務(wù)來說,線程數(shù)等于 CPU 數(shù)是最好的了。

02:如果是一個磁盤或網(wǎng)絡(luò)為主的程序(IO密集型程序),一個線程處在 IO 等待的時候,另一個線程還可以在 CPU 里面跑,有時候 CPU 閑著沒事干,所有的線程都在等著 IO,這時候他們就是同時的了,而單線程的話此時還是在一個一個等待的。我們都知道 IO 的速度比起 CPU 來是很慢的。此時線程數(shù)等于CPU核心數(shù)的兩倍是最佳的。

以上就是JAVA 自定義線程池的最大線程數(shù)設(shè)置方法的詳細(xì)內(nèi)容,更多關(guān)于JAVA 自定義線程池的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 一级片视频免费观看 | 欧美在线看欧美高清视频免费 | 欧美精品在线视频 | 99视频有精品视频免费观看 | 美国一级毛片∞ | 国产精品拍拍拍福利在线观看 | 日韩一级高清 | 欧美一级特黄aaa大片 | 国产日韩欧美精品一区二区三区 | 欧美精品成人一区二区在线观看 | 国产亚洲福利 | 亚洲色图亚洲色图 | 黄毛片| 婷婷草 | 色婷婷色综合激情国产日韩 | 国产精品亚洲精品观看不卡 | 亚洲精品午夜一区二区在线观看 | 麻豆视频观看 | 丁香婷婷综合五月六月 | 九九线精品视频 | 麻豆网站在线播放 | 国产精品盗摄一区二区在线 | 日本一级毛片大片免费 | 国产在线观看99 | 国产成人亚洲精品老王 | 日韩高清一区二区 | 毛片免费观看网址 | 91精品国产免费久久久久久 | 日韩不卡毛片 | 伊人2222| 成人亚洲欧美日韩中文字幕 | 九九精品视频在线播放8 | 日韩欧美国产偷亚洲清高 | 孕妇孕妇aaaaa级毛片视频 | 成年人午夜免费视频 | 手机看片日韩日韩韩 | 清纯唯美亚洲综合 | 91在线网站 | 亚洲高清成人欧美动作片 | 国产一区二区fc2ppv在线播放 | 国产免费女同性视频网站 |