大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動力節點LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 學習攻略 Java培訓 Java工程師培訓:ThreadPool用法與優勢

Java工程師培訓:ThreadPool用法與優勢

更新時間:2019-11-20 15:55:45 來源:動力節點 瀏覽2674次



  1.線程池的優點:


  合理利用線程池能夠帶來三個好處。第一:降低資源消耗。通過重復利用已創建的線程降低線程創建和銷毀造成的消耗。第二:提高響應速度。當任務到達時,任務可以不需要等到線程創建就能立即執行。第三:提高線程的可管理性。線程是稀缺資源,如果無限制的創建,不僅會消耗系統資源,還會降低系統的穩定性,使用線程池可以進行統一的分配,調優和監控。但是要做到合理的利用線程池,必須對其原理了如指掌。


  image.png


  2.線程池框架Executor:


  java中的線程池是通過Executor框架實現的,ThreadPoolExecutor:線程池的具體實現類,一般用的各種線程池都是基于這個類實現的。構造方法如下:


  參數介紹:


  corePoolSize:線程池的核心線程數,線程池中運行的線程數永遠不會超過corePoolSize個,默認情況下可以一直存活。


  keepAliveTime:默認情況下,只有當線程池中的線程數大于corePoolSize時,keepAliveTime才會起作用,直到線程池中的線程數不大于corePoolSize,即當線程池中的線程數大于corePoolSize時,如果一個線程空閑的時間達到keepAliveTime,則會終止,直到線程池中的線程數不超過corePoolSize。但是如果調用了allowCoreThreadTimeOut(boolean)方法,在線程池中的線程數不大于corePoolSize時,keepAliveTime參數也會起作用,直到線程池中的線程數為0;所以如果任務很多,并且每個任務執行的時間比較短,可以調大這個時間,提高線程的利用率。


  maximumPoolSize:線程池允許的最大線程數。如果隊列滿了,并且已創建的線程數小于最大線程數,則線程池會再創建新的線程執行任務。值得注意的是如果使用了無界的任務隊列這個參數就沒什么效果。


  unit:表示keepAliveTime的單位;可選的單位有天,小時,分鐘,毫秒。微秒,納秒等。


  workQueue:表示存放任務的阻塞隊列。


  BlockingQueue:阻塞隊列(BlockingQueue)是java.util.concurrent下的主要用來控制線程同步的工具。如果BlockQueue是空的,從BlockingQueue取東西的操作將會被阻斷進入等待狀態,直到BlockingQueue進了東西才會被喚醒。同樣,如果BlockingQueue是滿的,任何試圖往里存東西的操作也會被阻斷進入等待狀態,直到BlockingQueue里有空間才會被喚醒繼續操作。


  阻塞隊列常用于生產者和消費者的場景,生產者是往隊列里添加元素的線程,消費者是從隊列里拿元素的線程。阻塞隊列就是生產者存放元素的容器,而消費者也只從容器里拿元素。具體的實現類有LinkedBlockingQueue,ArrayBlockingQueued等。ArrayBlockingQueue:是一個基于數組結構的有界阻塞隊列,此隊列按FIFO(先進先出)原則對元素進行排序。LinkedBlockingQueue:一個基于鏈表結構的阻塞隊列,此隊列按FIFO(先進先出)排序元素,吞吐量通常要高于ArrayBlockingQueue。synchronousQueue:這個隊列比較特殊,它不會保存提交的任務,而是將直接新建一個線程來執行新來的任務


  3.線程池的線程程初始化


  默認情況下,創建線程池之后,線程池中是沒有線程的,需要提交任務之后才會創建線程。在實際中如果需要線程池創建之后立即創建線程,可以通過以下兩個方法辦到:


  prestartCoreThread():初始化一個核心線程;


  prestartAllCoreThreads():初始化所有核心線程


  4.worker類


  在ThreadPoolExecutor主要Worker類來控制線程的復用。線程池創建線程時,會將線程封裝成工作線程Worker,Worker在執行完任務后,還會無限循環獲取工作隊列里的任務來執行。


  5.線程池的工作過程


  線程池剛創建時,里面沒有一個線程。任務隊列是作為參數傳進來的。不過,就算隊列里面有任務,線程池也不會馬上執行它們。當提交一個新任務到線程池時,線程池會做如下判斷:


  如果正在運行的線程數量小于corePoolSize,那么馬上創建線程運行這個任務;


  如果正在運行的線程數量大于或等于corePoolSize,那么將這個任務放入隊列;


  如果這時候隊列滿了,而且正在運行的線程數量小于maximumPoolSize,那么還是要創建非核心線程立刻運行這個任務;


  如果隊列滿了,而且正在運行的線程數量大于或等于maximumPoolSize,那么會采取任務拒絕策略,如下:


  當一個線程完成任務時,它會從隊列中取下一個任務來執行。


  當一個線程無事可做,超過一定的時間(keepAliveTime)時,線程池會判斷,如果當前運行的線程數大于corePoolSize,那么這個線程就被停掉。所以線程池的所有任務完成后,它最終會收縮到corePoolSize的大小。


  6.線程池的關閉


  ThreadPoolExecutor提供了兩個方法,用于線程池的關閉,分別是shutdown()和shutdownNow(),其中:shutdown():不會立即終止線程池,而是要等所有任務緩存隊列中的任務都執行完后才終止,但再也不會接受新的任務。shutdownNow():立即終止線程池,并嘗試打斷正在執行的任務,并且清空任務緩存隊列,返回尚未執行的任務。


  7.線程池容量的動態調整


  ThreadPoolExecutor提供了動態調整線程池容量大小的方法:setCorePoolSize()和setMaximumPoolSize(),


  setCorePoolSize:設置核心池大小


  setMaximumPoolSize:設置線程池最大能創建的線程數目大小


  當上述參數從小變大時,ThreadPoolExecutor進行線程賦值,還可能立即創建新的線程來執行任務。


  8.幾種類型的線程池


  1)SingleThreadExecutor:單個后臺線程(其緩沖隊列是LinkedBlockingQueue,無界的)


  創建一個單線程的線程池。這個線程池只有一個核心線程在工作,也就是相當于單線程串行執行所有任務。如果這個唯一的線程因為異常結束,那么會有一個新的線程來替代它。此線程池保證所有任務的執行順序按照任務的提交順序執行。


  舉例子:比如一個村里只有一口井,每次只能一個人打水,先來先打。


  2)FixedThreadPool:只有核心線程的線程池,大小固定(其緩沖隊列是LinkedBlockingQueue,無界的)。


  創建固定大小的線程池。每次提交一個任務就創建一個線程,直到線程達到線程池的最大大小。線程池的大小一旦達到最大值就會保持不變,如果某個線程因為執行異常而結束,那么線程池會補充一個新線程。


  舉例子:村里有3口井,大家排隊打井水,可以無數人排隊,井只有3口,每次最多只能有3個人打井水。沒人打水時,3口井也在那里。由于線程不會回收,FixThreadPool會更快地響應外界請求,這也很容易理解,就好像有人突然想打井水,井不是現用現建的。


  3)CachedThreadPool:無界線程池,可以進行自動線程回收。(其緩沖隊列是SynchronousQueue,一個是緩沖區為1的阻塞隊列


  如果線程池的大小超過了處理任務所需要的線程,那么就會回收部分空閑(60秒不執行任務)的線程,當任務數增加時,此線程池又可以智能的添加新線程來處理任務。此線程池不會對線程池大小做限制,線程池大小完全依賴于操作系統(或者說JVM)能夠創建的最大線程大小。


  舉個例子:CachedThreadPool就像是一堆人去一個很大的咖啡館喝咖啡,里面服務員也很多,隨時去,隨時都可以喝到咖啡。但是為了響應國家的“光盤行動”,一個人喝剩下的咖啡會被保留60秒,供新來的客人使用,哈哈哈哈哈,好惡心啊。如果你運氣好,沒有剩下的咖啡,你會得到一杯新咖啡。但是以前客人剩下的咖啡超過60秒,就變質了,會被服務員回收掉。比較適合執行大量的耗時較少的任務。喝咖啡人挺多的,喝的時間也不長。


  4)ScheduledThreadPool:核心線程池固定,大小無限的線程池。核心線程數固定,非核心線程(閑著沒活干會被立即回收)數沒有限制。此線程池支持定時以及周期性執行任務的需求。


       以上就是動力節點java學院小編針對“Java工程師培訓:ThreadPool用法與優勢”的內容進行的回答,希望對大家有所幫助,如果對于學習Java的學習計劃,怎么學才有效率,或者學完如果找工作的問題,請在線咨詢,有專業老師隨時為你服務。


零基礎自學java教程推薦


最新java視頻教程免費下載(從入門到精通):http://www.dabaquan.cn/video.html


零基礎java自學教程http://www.dabaquan.cn/tutorial_java_se/


相關推薦


零基礎學Java編程,這些內容你一定要知道


學習Java編程了解一些免費Java開發工具


初學者學Java編程真的很難?


新手自學Java編程需要多長時間呢


學習Java編程可以做什么


提交申請后,顧問老師會電話與您溝通安排學習

免費課程推薦 >>
技術文檔推薦 >>
主站蜘蛛池模板: 成人网欧美亚洲影视图片 | 九九精品视频免费 | 色婷婷六月| 国产精品欧美一区二区三区 | 亚洲欧美日韩在线一区二区三区 | 一级毛片在线看在线播放 | 日韩视频网址 | 日韩毛片在线观看 | 亚洲精品视频在线观看视频 | 一级大片免费观看 | 亚洲欧美日本视频 | 日韩精品一区二区三区免费视频 | 精品一区二区三区在线观看l | 国产区综合另类亚洲欧美 | a v在线男人的天堂观看免费 | 99高清免费国产自产拍 | 色综合久久久久综合体桃花网 | 亚洲福利视频精选在线视频 | 国产福利资源在线 | 亚洲精品色一区二区三区 | 精品久久天干天天天按摩 | 中文国产成人精品久久无广告 | 91精品国产自产91精品 | 国产欧美一区视频在线观看 | 黄动漫在线无限看免费 | 韩日一级毛片 | 欧美精品午夜 | 久久国产精品无码网站 | 久久www香蕉免费人成 | 久久国产精品男女热播 | 日日摸夜夜摸狠狠摸日日碰夜夜做 | jizzjizz亚洲女人 | 久久九九青青国产精品 | 天天操天天摸天天爽 | 91精品国产露脸在线 | 99精品视频99 | 黑人特级粗α级毛片 | 四虎最新紧急入口 | 久久精品九九 | 国产草草| 欧美日韩在线视频一区 |