国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

阿里規(guī)范竟然不讓我用這種方式創(chuàng)建線程池

開發(fā) 前端
我們既然要了解線程池,那么肯定是需要從幾個(gè)角度來考慮,第一,什么是線程池?第二:為什么需要線程池?第三,線程池的創(chuàng)建方式都有哪些。

今天我們來聊一下這個(gè) Java 中的線程池,線程池,這塊的內(nèi)容,已經(jīng)是非常的容易被面試官問到的內(nèi)容,為什么呢?這是因?yàn)榫€程池,是一種多線程的處理方式,如果使用方式得當(dāng)?shù)脑挘敲磳?duì)我們的代碼的質(zhì)量也是非常高的。

我們既然要了解線程池,那么肯定是需要從幾個(gè)角度來考慮,第一,什么是線程池?第二:為什么需要線程池?第三,線程池的創(chuàng)建方式都有哪些。

什么是線程池

線程池是一種多線程處理形式,處理過程中將任務(wù)添加到隊(duì)列,然后在創(chuàng)建線程后自動(dòng)啟動(dòng)這些任務(wù)。

線程池線程都是后臺(tái)線程。每個(gè)線程都使用默認(rèn)的堆棧大小,以默認(rèn)的優(yōu)先級(jí)運(yùn)行,并處于多線程單元 中。如果某個(gè)線程在托管代碼中空閑(如正在等待某個(gè)事件),則線程池將插入另一個(gè)輔助線程來使所 有處理器保持繁忙。

如果所有線程池線程都始終保持繁忙,但隊(duì)列中包含掛起的工作,則線程池將在一段時(shí)間后創(chuàng)建另一個(gè)輔助線程但線程的數(shù)目永遠(yuǎn)不會(huì)超過最大值。超過最大值的線程可以排隊(duì),但他們要等到其他線程完成后才啟動(dòng)。

為什么需要線程池

我們有兩種常見的創(chuàng)建線程的方法,

  • 一種是繼承Thread類,
  • 一種是實(shí)現(xiàn)Runnable的接口,Thread類其實(shí)也是實(shí)現(xiàn)了Runnable接口。

但是我們創(chuàng)建這兩種線程在運(yùn)行結(jié)束后都會(huì)被虛擬機(jī)銷毀,如果線程數(shù)量多的話,頻繁的創(chuàng)建和銷毀線程會(huì)大大浪費(fèi)時(shí)間和效率,更重要的是浪費(fèi)內(nèi)存。那么有沒有一種方法能讓線程運(yùn)行完后不立即銷毀,而是讓線程重復(fù)使用,繼續(xù)執(zhí)行其他的任務(wù)哪?

這就是線程池的由來,很好的解決線程的重復(fù)利用,避免重復(fù)開銷。

線程池的優(yōu)點(diǎn)都有哪些?

(1)重用存在的線程,減少對(duì)象創(chuàng)建銷毀的開銷。

(2)可有效的控制最大并發(fā)線程數(shù),提高系統(tǒng)資源的使用率,同時(shí)避免過多資源競爭,避免堵塞。

(3)提供定時(shí)執(zhí)行、定期執(zhí)行、單線程、并發(fā)數(shù)控制等功能。

而且優(yōu)點(diǎn)這么多,那么肯定就得知道 Java 提供了哪些線程池的實(shí)現(xiàn)方式了。

Java 提供了哪幾種線程池

種類一

FixedThreadPool

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

newFixedThreadPool 實(shí)際上返回的是 ThreadPoolExecutor,ThreadPoolExecutor 實(shí)際就是線程池實(shí)現(xiàn)類,使用了典型的模板方法設(shè)計(jì)模式,通過ThreadPoolExecutor構(gòu)造器的說明我們稍微解釋一下各參數(shù)的意思:

構(gòu)造器如下:

public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue) {
        this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
             Executors.defaultThreadFactory(), defaultHandler);
    }
  • corePoolSize 核心線程數(shù),線程池一直存在的線程(即使這些線程是空閑的),除非你設(shè)置allowCoreThreadTimeOut
  • maximumPoolSize 線程池中允許存在的最多的線程數(shù),當(dāng)workQueue滿了之后會(huì)創(chuàng)建線程直到數(shù)量達(dá)到maximumPoolSize
  • keepAliveTime 當(dāng)線程池中的線程數(shù)超過核心線程數(shù),超過部分的線程可以空閑keepAliveTime時(shí)間,如果這段時(shí)間還沒有任務(wù)過來則超過部分線程就會(huì)銷毀
  • unit keepAliveTime的單位
  • workQueue 等待隊(duì)列,當(dāng)corePoolSize線程都在處理任務(wù)時(shí),新進(jìn)入線程池的任務(wù)則翻入等待下隊(duì)列
  • threadFactory 創(chuàng)建線程池中線程的線程工廠
  • handler 拒絕策略 當(dāng)線程池已達(dá)到最大線程數(shù)和等待隊(duì)列也已經(jīng)滿了,則使用拒絕策略

而newFixedThreadPool使用了corePoolSize和maximumPoolSize相等,所以當(dāng)線程池線程數(shù)到達(dá)corePoolSize之后就不會(huì)再創(chuàng)建線程。

并且newFixedThreadPool使用了LinkedBlockingQueue,而且使用的是默認(rèn)構(gòu)造器,容量是Integer.MAX_VALUE,keepAliveTime是0,實(shí)際上設(shè)不設(shè)置都沒關(guān)系,因?yàn)椴粫?huì)超過核心線程數(shù)。

實(shí)際上我們也可以理解為FixedThreadPool該線程池中的線程數(shù)量始不變。當(dāng)有一個(gè)新的任務(wù)提交時(shí),線程池中若有空閑線程,則立即執(zhí)行。若沒有,則新的任務(wù)會(huì)被暫存在一個(gè)任務(wù)隊(duì)列中,待有線程空閑時(shí),便處理在任務(wù)隊(duì)列中的任務(wù)。

種類二

SingleThreadExecutor

實(shí)際上SingleThreadExecutor是使用單個(gè) worker 線程的Executor。

也就是說方法返回一個(gè)只有一個(gè)線程的線程池。若多余一個(gè)任務(wù)被提交到該線程 池,任務(wù)會(huì)被保存在一個(gè)任務(wù)隊(duì)列中,待線程空閑,按先入先出的順序執(zhí)行隊(duì)列中的任務(wù)

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

SingleThreadExecutor 的 corePoolSize 和 maximumPoolSize 被設(shè)置為 1 。其他參數(shù)與 FixedThreadPool 相同。 SingleThreadExecutor 使用無 隊(duì)列 LinkedBlockingQueue 作 為線程池的工作隊(duì)列( 隊(duì)列的容量為Integer.MAX_VALUE )。

種類三

CachedThreadPool

該方法返回一個(gè)可根據(jù)實(shí)際情況調(diào)整線程數(shù)量的線程池。線程池的線程數(shù) 量不確定,但若有空閑線程可以復(fù)用,則會(huì)優(yōu)先使用可復(fù)用的線程。若所有線程均在工作,又有新 的任務(wù)提交,則會(huì)創(chuàng)建新的線程處理任務(wù)。所有線程在當(dāng)前任務(wù)執(zhí)行完畢后,將返回線程池進(jìn)行復(fù) 用。

public static ExecutorService newCachedThreadPool() {
        return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
                                      60L, TimeUnit.SECONDS,
                                      new SynchronousQueue<Runnable>());
    }
  • 這個(gè)線程池corePoolSize是0,maximumPoolSize是Integer.MAX_VALUE,根據(jù)我們之前對(duì)源碼的分析,CachedThreadPool不會(huì)有核心線程,核心線程數(shù)的addworker方法不會(huì)執(zhí)行,直接嘗試加入queue中。
  • keepAliveTime是60s,也就是60s從隊(duì)列中沒有拿到任務(wù),worker就會(huì)自動(dòng)銷毀。
  • queue使用的是SynchronousQueue,這個(gè)就是CachedThreadPool實(shí)現(xiàn)不停創(chuàng)建工作線程的關(guān)鍵,因?yàn)榫€程池處理任務(wù)分為三步:有任務(wù)過來先創(chuàng)建核心線程,當(dāng)線程數(shù)達(dá)到核心線程數(shù)時(shí)則會(huì)進(jìn)入等待隊(duì)列,當(dāng)?shù)却?duì)列滿了則再創(chuàng)建非核心線程,直到線程數(shù)達(dá)到最大線程數(shù)后執(zhí)行拒絕策略,所以可以猜測SynchronousQueue應(yīng)該是沒有容量的隊(duì)列,放入一個(gè)offer操作必須有一個(gè)poll操作在等待,沒有的話就執(zhí)行入隊(duì)失敗,然后創(chuàng)建非核心線程進(jìn)行處理
  • 線程工廠和拒絕策略都沒有指定,則使用的就是默認(rèn)的,默認(rèn)的拒絕策略是丟出一個(gè)異常

種類四

ScheduledThreadPoolExecutor

這個(gè)線程池的構(gòu)造器就比較多了

// 第一個(gè)構(gòu)造函數(shù)
   public ScheduledThreadPoolExecutor(int corePoolSize) {
       super(corePoolSize, Integer.MAX_VALUE,
             DEFAULT_KEEPALIVE_MILLIS, MILLISECONDS,
             new DelayedWorkQueue());
   }

   // 第二個(gè)構(gòu)造函數(shù)
   public ScheduledThreadPoolExecutor(int corePoolSize,
                                      ThreadFactory threadFactory) {
       super(corePoolSize, Integer.MAX_VALUE,
             DEFAULT_KEEPALIVE_MILLIS, MILLISECONDS,
             new DelayedWorkQueue(), threadFactory);
   }

   // 第三個(gè)構(gòu)造函數(shù)
   public ScheduledThreadPoolExecutor(int corePoolSize,
                                      RejectedExecutionHandler handler) {
       super(corePoolSize, Integer.MAX_VALUE,
             DEFAULT_KEEPALIVE_MILLIS, MILLISECONDS,
             new DelayedWorkQueue(), handler);
   }

   // 第四個(gè)構(gòu)造函數(shù)
   public ScheduledThreadPoolExecutor(int corePoolSize,
                                      ThreadFactory threadFactory,
                                      RejectedExecutionHandler handler) {
       super(corePoolSize, Integer.MAX_VALUE,
             DEFAULT_KEEPALIVE_MILLIS, MILLISECONDS,
             new DelayedWorkQueue(), threadFactory, handler);
   }

主要用來在給定的延遲后運(yùn)行任務(wù),或者定期執(zhí)行任務(wù)。ScheduledThreadPoolExecutor又分為:ScheduledThreadPoolExecutor(包含多個(gè)線程)和SingleThreadScheduledExecutor (只包含一個(gè)線程)兩種。

線程池的創(chuàng)建方式

其實(shí)創(chuàng)建方式,就是Executors,使用 Executors 可以非常輕易的創(chuàng)建我們上面所說的這幾種線程池。但是呢,有一個(gè)地方不知道大家有沒有注意到,在 阿里的開發(fā)手冊(cè)上面,是不允許使用 Executors 去創(chuàng)建的,更推薦我們使用的是 ThreadPoolExecutor 構(gòu)造去創(chuàng)建,這樣的好處就是為了規(guī)避資源耗盡的風(fēng)險(xiǎn)那時(shí)候拋出的就不是異常,而是錯(cuò)誤了。

使用ThreadPoolExecutor的構(gòu)造函數(shù)創(chuàng)建

private static ExecutorService executor = new ThreadPoolExecutor(13, 13,
60L, TimeUnit.SECONDS,
new ArrayBlockingQueue(13));

我們可以自己直接調(diào)用 ThreadPoolExecutor 的構(gòu)造函數(shù)來自己創(chuàng)建線程池。在創(chuàng)建的同時(shí),給 BlockQueue 指定容量就可以了。

這時(shí)候如果提交的線程數(shù)超過了可用線程數(shù)的時(shí)候,就會(huì)拋出異常,比如 java.util.concurrent.RejectedExecutionException,這是因?yàn)楫?dāng)前線程池使用的隊(duì)列是有邊界隊(duì)列,隊(duì)列已經(jīng)滿了便無法繼續(xù)處理新的請(qǐng)求。

如果你覺得對(duì) Error 和 Exception 沒有任何感覺得話,你也是可以使用 Executors 去創(chuàng)建的。

你還知道有其他方式去創(chuàng)建線程池的么?

責(zé)任編輯:武曉燕 來源: Java極客技術(shù)
相關(guān)推薦

2020-12-07 13:21:13

程序員歷史Python

2019-11-13 14:38:34

Executors阿里線程池

2020-04-29 14:10:44

Java線程池編程語言

2024-10-31 09:30:05

線程池工具Java

2022-03-07 07:33:16

線程池Java語言

2024-01-03 08:15:35

Executors線程池線程

2020-12-17 05:52:09

線程池ThreadPoolThreadPoolE

2025-01-14 07:00:00

線程池ExecutorsJava

2025-04-17 08:47:23

2024-12-20 08:20:46

2019-10-30 21:27:51

Java中央處理器電腦

2010-03-18 15:31:13

Java創(chuàng)建線程

2021-05-06 07:00:28

Excel數(shù)據(jù)技巧

2021-11-16 07:26:05

開源項(xiàng)目規(guī)范

2021-03-22 15:19:25

網(wǎng)絡(luò)安全數(shù)據(jù)技術(shù)

2013-08-06 10:00:52

IDC阿里云華為

2009-06-29 17:54:10

Java多線程Thread類創(chuàng)建線程

2021-12-07 18:33:53

Kafka消息集群

2024-03-04 10:36:39

2024-11-06 09:39:52

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

国产女主播一区二区三区| 久久黄色网页| 91在线丨porny丨国产| 日韩女优视频免费观看| 手机在线看福利| 日韩av一区二区三区| 18成人在线| 亚洲成人免费| 国产99久久久欧美黑人| 亚洲91精品在线| 日本三级一区| 91精品国产91综合久久蜜臀| 国产高清自拍视频在线观看| 黄色精品一区二区| 亚洲美女在线免费观看| 亚洲欧洲制服丝袜| 欧美激情亚洲国产| jizz性欧美23| 久久999免费视频| 久久久久97| 欧美在线xxx| 亚洲网色网站| 久久资源av| 高潮精品一区videoshd| 久久香蕉视频网站| 99热这里都是精品| 成人淫片免费视频95视频| 亚洲福利一二三区| 成人在线视频成人| 亚洲国产另类久久精品 | 成人午夜国产| 久久久久久久久久久网站| 国内精品久久久久久久影视简单| 成人激情直播| 北岛玲一区二区三区四区| 黄色一级片播放| 欧美性猛xxx| 国产精品亚洲四区在线观看 | 伊人手机在线| 2020久久国产精品| 日本亚洲免费观看| 凹凸国产熟女精品视频| 亚洲v精品v日韩v欧美v专区| 黄在线免费看| 国产精品国模在线| 久久国产精品99精品国产| 天堂аⅴ在线最新版在线| 亚洲性夜色噜噜噜7777| 国产日韩欧美一区在线| 免费精品视频一区二区三区| 国产精品一卡| 97秋霞电影网| 海角国产乱辈乱精品视频| 白白色 亚洲乱淫| 在线最新版中文在线| 欧洲一区二区日韩在线视频观看免费 | 91成人在线观看国产| 亚洲欧美日韩成人高清在线一区| 久久久亚洲欧洲日产| aaaaa毛片| 欧洲中文字幕国产精品| 国产精品网站在线播放| 理论片一区二区在线| 青青色在线视频| 国产精品久久久久影院日本 | 日韩黄色网址| 99三级在线| 4438成人网| 成人午夜精品一区二区三区| 高清av不卡| www.亚洲天堂网| 欧美乱大交xxxxx另类电影| 国产欧美日韩在线看| 久久精品高清| 涩涩视频在线免费看| 国产青青视频| 中文字幕第一页亚洲| 久久久精品免费免费| 国产69精品久久久久按摩| 肉大捧一出免费观看网站在线播放 | 91美女福利视频| 看黄网站在线| 在线观看亚洲视频| 青梅竹马是消防员在线| 91色中文字幕| 粉嫩av一区二区三区粉嫩| 久久久久97| 日本视频在线观看| av网站在线观看不卡| 亚洲自拍偷拍视频| 自拍亚洲一区欧美另类| 中文字幕不卡在线播放| 免费成人在线电影| 亚洲新中文字幕| 欧美视频日韩| 成人在线观看黄色| 91精品国产91久久久久久吃药 | 中文字幕欧美国内| 正在播放日韩欧美一页 | 久久久久国产精品免费| 狠狠狠色丁香婷婷综合激情| 成人精品一区二区三区校园激情| 欧美国产日韩一区二区三区| 国产一区福利在线| 日本天堂在线观看| 91免费版网站入口| 亚洲精品视频在线看| 性欧美video另类hd尤物| 亚洲欧美精品在线观看| 欧美日韩国产123区| 91九色精品| 中文字幕97| 欧美在线一区二区视频| 国产精品天干天干在观线| 欧美成人黄色| 日韩欧美色电影| 国产精品免费99久久久| 中文字幕视频在线免费观看| 日韩中文字幕在线视频| 国产一区不卡精品| 蜜桃视频www网站在线观看| 欧美日韩国产精品一区二区| 欧美私模裸体表演在线观看| 66视频精品| 韩国福利在线| 国产精品久久国产三级国电话系列| 日韩欧美福利视频| 亚洲午夜精品久久久久久app| 男人av在线| 国产伦精品一区二区三区照片| 欧美色综合天天久久综合精品| 尤物精品在线| 欧美日韩在线视频免费观看| 日韩视频中文字幕| 国产成人丝袜美腿| 色豆豆成人网| 国内外成人免费激情视频| 欧美激情精品久久久久久黑人 | 精品国产乱子伦一区| 久久九九国产| 国产美女一区视频| 伊人久久大香线蕉精品| 亚洲精品99久久久久中文字幕| 精品亚洲欧美一区| 成人四虎影院| 天美星空大象mv在线观看视频| 久久全球大尺度高清视频| 亚洲欧美日韩一区| 999国产精品| 黄网站免费在线观看| 中文字幕人成一区| 欧美另类在线观看| 亚洲精品成人天堂一二三| 国产精品成人av| 久草中文在线观看| 中文精品一区二区三区| 最近2019中文字幕一页二页| 综合亚洲色图| 头脑特工队2在线播放| 欧美精品一区二区三区久久| 亚洲国产日韩欧美在线99| a在线播放不卡| 深爱激情久久| 91av资源在线| 99在线免费视频观看| 日本精品视频在线观看| 欧美日韩精品欧美日韩精品| 国产精品白丝jk黑袜喷水| 色橹橹欧美在线观看视频高清| av男人的天堂在线| 你真棒插曲来救救我在线观看| 日韩av快播网址| 欧美不卡一区二区| 国产天堂亚洲国产碰碰| 婷婷伊人综合| 日韩制服一区| 污网站在线观看视频| 中文字幕精品在线播放| 欧美重口另类videos人妖| 日韩一区二区三区在线视频| 国产日韩影视精品| 国产欧美日韩一区二区三区在线| 欧美一级做a| 成人在线播放视频| 欧美三级午夜理伦三级| 国产精品视频免费一区二区三区| 最近2019年日本中文免费字幕| 疯狂欧美牲乱大交777| 国产成人精品一区二区三区四区| 日韩精品永久网址| 成人黄色毛片| 欧美日韩欧美| 狠狠干婷婷色| 人人干视频在线| 精品国产免费久久久久久尖叫| 欧美激情xxxxx| 国产偷亚洲偷欧美偷精品| 欧美日韩国产限制| 国产午夜精品在线观看| 免费的国产精品|