線程池的使用以及實現(xiàn)原理

線程池優(yōu)點(diǎn)

  • 限流
    控制線程總數(shù),根據(jù)硬件人為控制使性能達(dá)到最優(yōu)
  • 復(fù)用
    減少線程的頻繁創(chuàng)建和銷毀復(fù)用線程
  • 效率
    因為線程可復(fù)用任務(wù)相應(yīng)更快

java中的線程池

        Executors.newFixedThreadPool(nThreads);//固定線程數(shù)線程池
        Executors.newCachedThreadPool();//有伸縮性線程池,線程60shou后回收
        Executors.newSingleThreadExecutor();//只有一個核心線程的線程池
        Executors.newSingleThreadScheduledExecutor();//定時任務(wù)線程池
        Executors.newWorkStealingPool();//fork/join線程池
  • Executors核心構(gòu)造方法
    public ThreadPoolExecutor(int corePoolSize,//核心線程數(shù)
                              int maximumPoolSize,//最大線程數(shù)
                              long keepAliveTime,//超時時間
                              TimeUnit unit,//超時時間單位
                              BlockingQueue<Runnable> workQueue,//緩沖隊列
                              ThreadFactory threadFactory,//線程工廠
                              RejectedExecutionHandler handler//拒絕策略
 ) {
        if (corePoolSize < 0 ||
            maximumPoolSize <= 0 ||
            maximumPoolSize < corePoolSize ||
            keepAliveTime < 0)
            throw new IllegalArgumentException();
        if (workQueue == null || threadFactory == null || handler == null)
            throw new NullPointerException();
        this.corePoolSize = corePoolSize;
        this.maximumPoolSize = maximumPoolSize;
        this.workQueue = workQueue;
        this.keepAliveTime = unit.toNanos(keepAliveTime);
        this.threadFactory = threadFactory;
        this.handler = handler;
    }
  • newFixedThreadPool
    public static ExecutorService newFixedThreadPool(int nThreads) {
        return new ThreadPoolExecutor(nThreads, //核心線程數(shù)=傳入線程數(shù)
                                      nThreads,//最大線程數(shù)=傳入線程數(shù)
                                      0L,//超時間=0
                                      TimeUnit.MILLISECONDS,//超時時間單位=秒
                                      new LinkedBlockingQueue<Runnable>()//雙向鏈表阻塞隊列
);
    }
  • newCachedThreadPool
    public static ExecutorService newCachedThreadPool() {
        return new ThreadPoolExecutor(
                                      0, //核心線程數(shù)=0
                                      Integer.MAX_VALUE,//最大線程數(shù)=Integer最大值(可當(dāng)做無限大)
                                      60L, //超時時間=60
                                      TimeUnit.SECONDS,//超時時間單位=秒
                                      new SynchronousQueue<Runnable>()//不存儲元素的阻塞隊列
);
    }
  • newSingleThreadExecutor
public static ExecutorService newSingleThreadExecutor() {
        return new FinalizableDelegatedExecutorService
            (new ThreadPoolExecutor(1, 核心線程數(shù)=1
                                    1,//最大線程數(shù)=1
                                    0L,//超時時間0     
                                    TimeUnit.MILLISECONDS,//超時時間單位:毫秒
                                    new LinkedBlockingQueue<Runnable>()//雙向鏈表阻塞隊列
));
    }

執(zhí)行流程圖

image.png

問題

  • 1.不建議使用Executors創(chuàng)建線程池?為什么?
    Executors創(chuàng)建的線程池內(nèi)置的參數(shù),使開發(fā)人員在不用了解線程池各個參數(shù)的含義的情況下進(jìn)行使用.
    在實際生產(chǎn)環(huán)境上運(yùn)行是十分危險的
  • 2.線程池大小的設(shè)置?
    CPU 核數(shù):
    IO密集型:每個線程執(zhí)行時間長,cpu利用率低;可以多設(shè)置一些;CPU核數(shù)2或者 (線程等待時間+線程CUP時間)/線程CPU時間cup核數(shù)
    CUP密集型:cpu核數(shù)+1
    -3.線程池預(yù)熱:
    ThreadPollExecutor.prestartAllCoreThreads()
  • 4 execute()與 submit()的區(qū)別
    submit(Callable<T>) 執(zhí)行待返回值的任務(wù),根據(jù)返回值可知任務(wù)的執(zhí)行結(jié)果
    submit()不會拋出異常,異常根據(jù)Callable返回
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市蹋绽,隨后出現(xiàn)的幾起案子溜族,更是在濱河造成了極大的恐慌酌壕,老刑警劉巖河咽,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件寺庄,死亡現(xiàn)場離奇詭異俐巴,居然都是意外死亡耀石,警方通過查閱死者的電腦和手機(jī)牵囤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來娶牌,“玉大人奔浅,你說我怎么就攤上這事∈迹” “怎么了汹桦?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長鉴裹。 經(jīng)常有香客問我舞骆,道長,這世上最難降的妖魔是什么径荔? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任督禽,我火速辦了婚禮,結(jié)果婚禮上总处,老公的妹妹穿的比我還像新娘狈惫。我一直安慰自己,他們只是感情好鹦马,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布胧谈。 她就那樣靜靜地躺著,像睡著了一般荸频。 火紅的嫁衣襯著肌膚如雪菱肖。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天旭从,我揣著相機(jī)與錄音稳强,去河邊找鬼。 笑死和悦,一個胖子當(dāng)著我的面吹牛退疫,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播鸽素,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼蹄咖,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了付鹿?” 一聲冷哼從身側(cè)響起澜汤,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎舵匾,沒想到半個月后俊抵,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡坐梯,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年徽诲,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片吵血。...
    茶點(diǎn)故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡谎替,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蹋辅,到底是詐尸還是另有隱情钱贯,我是刑警寧澤,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布侦另,位于F島的核電站秩命,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏褒傅。R本人自食惡果不足惜弃锐,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望殿托。 院中可真熱鬧霹菊,春花似錦、人聲如沸支竹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽唾戚。三九已至柳洋,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間叹坦,已是汗流浹背熊镣。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留募书,地道東北人绪囱。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像莹捡,于是被迫代替她去往敵國和親鬼吵。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評論 2 360

推薦閱讀更多精彩內(nèi)容

  • 相信大家都使用過線程池篮赢,也了解使用線程池的好處齿椅。我們使用線程池最多的還是使用Executors工具類創(chuàng)建Fixed...
    逍遙無極閱讀 1,562評論 2 0
  • 并發(fā)的學(xué)習(xí)與使用系列 第五篇 線程池的技術(shù)背景 在面向?qū)ο缶幊讨辛鹜冢瑒?chuàng)建和銷毀對象是很費(fèi)時間的,因為創(chuàng)建一個對象要獲...
    SilenceDut閱讀 1,069評論 1 24
  • 先看幾個概念:線程:進(jìn)程中負(fù)責(zé)程序執(zhí)行的執(zhí)行單元。一個進(jìn)程中至少有一個線程遣蚀。多線程:解決多任務(wù)同時執(zhí)行的需求矾麻,合理...
    yeying12321閱讀 545評論 0 0
  • 最近無意中在github上看到大牛張云龍寫的關(guān)于前端工程化的文章,雖然文章是幾年寫的芭梯,但我讀完之后依舊收獲滿滿险耀,不...
    蘑菇均閱讀 635評論 0 0
  • 這是王小小大二暑假的假期。 小小早就計劃好了玖喘,假期里一定要把買好的五本名著看完甩牺,再把英語好好學(xué)習(xí)一下,回來考四級芒涡。...
    梅好時光er閱讀 575評論 0 1