黄色网址大全免费-黄色网址你懂得-黄色网址你懂的-黄色网址有那些-免费超爽视频-免费大片黄国产在线观看

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動力節點LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 學習攻略 Java學習 程序員常見的Java線程池面試題

程序員常見的Java線程池面試題

更新時間:2020-03-11 10:20:35 來源:動力節點 瀏覽6314次

Java通過Executors提供四種線程池

  • CachedThreadPool():可緩存線程池。
  • FixedThreadPool():定長線程池。
  • ScheduledThreadPool():定時線程池。
  • SingleThreadExecutor():單線程化的線程池。

ThreadPoolExecutor的執行流程

  • 線程數量未達到corePoolSize,則新建一個線程(核心線程)執行任務。
  • 線程數量達到了corePools,則將任務移入隊列等待。
  • 隊列已滿,新建線程(非核心線程)執行任務。
  • 隊列已滿,總線程數又達到了maximumPoolSize,就會由(RejectedExecutionHandler)拋出異常(拒絕策略)
  • 新建線程->達到核心數->加入隊列->新建線程(非核心)->達到最大數->觸發拒絕策略

ThreadPoolExecutor的幾個參數

corePoolSize:核心池的大小,這個參數跟后面講述的線程池的實現原理有非常大的關系。在創建了線程池后,默認情況下,線程池中并沒有任何線程,而是等待有任務到來才創建線程去執行任務,除非調用了prestartAllCoreThreads()或者prestartCoreThread()方法,從這2個方法的名字就可以看出,是預創建線程的意思,即在沒有任務到來之前就創建corePoolSize個線程或者一個線程。默認情況下,在創建了線程池后,線程池中的線程數為0,當有任務來之后,就會創建一個線程去執行任務,當線程池中的線程數目達到corePoolSize后,就會把到達的任務放到緩存隊列當中。

maximumPoolSize:線程池最大線程數,這個參數也是一個非常重要的參數,它表示在線程池中最多能創建多少個線程;如果當前阻塞隊列滿了,且繼續提交任務,則創建新的線程執行任務,前提是當前線程數小于maximumPoolSize;當阻塞隊列是無界隊列,則maximumPoolSize不起作用,因為無法提交至核心線程池的線程會一直持續地放入workQueue(工作隊列)中。

keepAliveTime:表示線程沒有任務執行時最多保持多久時間會終止。默認情況下,只有當線程池中的線程數大于corePoolSize時,keepAliveTime才會起作用,直到線程池中的線程數不大于corePoolSize,即當線程池中線程數大于corePoolSize時,如果一個線程空閑的時間達到keepAliveTime,則會終止,直到線程池中的線程數不超過corePoolSize。但是如果調用了allowCoreThreadTimeOut(boolean)方法,在線程池中的線程數不大于corePoolSize時,keepAliveTime參數也會起作用,直到線程池中的線程數為0。

allowCoreThreadTimeout:默認情況下超過keepAliveTime的時候,核心線程不會退出,可通過將該參數設置為true,讓核心線程也退出。

unit:可以指定keepAliveTime的時間單位。

workQueue

ArrayBlockingQueue有界隊列,需要指定隊列大小。

LinkedBlockingQueue若指定大小則和ArrayBlockingQueue類似,若不指定大小則默認能存儲Integer.MAX_VALUE個任務,相當于無界隊列,此時maximumPoolSize值其實是無意義的。

SynchronousQueue同步阻塞隊列,當有任務添加進來后,必須有線程從隊列中取出,當前線程才會被釋放,newCachedThreadPool就使用這種隊列。

RejectedExecutionHandler:線程數和隊列都滿的情況下,線程池會執行的拒絕策略,有四個(也可以使用自定義的策略)。

線程池的四種拒絕策略

  • AbortPolicy:不執行新任務,直接拋出異常,提示線程池已滿,線程池默認策略。
  • DiscardPolicy:不執行新任務,也不拋出異常,基本上為靜默模式。
  • DisCardOldSetPolicy:將消息隊列中的第一個任務替換為當前新進來的任務執行。
  • CallerRunPolicy:拒絕新任務進入,如果該線程池還沒被關閉,那么這個新的任務在執行線程中被調用。

Executors和ThreadPoolExecutor創建線程的區別

Executors

newFixedThreadPool和newSingleThreadExecutor:主要問題是堆積的請求處理隊列可能會耗費非常大的內存,甚至OOM。

newCachedThreadPool和newScheduledThreadPool:主要問題是線程數最大數是Integer.MAX_VALUE(2的31次方-1,int類型最大值),可能會創建數量非常多的線程,甚至OOM。

ThreadPoolExecutor

創建線程池方式只有一種,就是走它的構造函數,參數自己指定。

為什么使用線程池

減少了創建和銷毀線程的次數,每個工作線程都可以被重復利用,可執行多個任務。

運用線程池能有效的控制線程最大并發數,可以根據系統的承受能力,調整線程池中工作線線程的數目,防止因為消耗過多的內存,而把服務器累趴下(每個線程需要大約1MB內存,線程開的越多,消耗的內存也就越大,最后死機)。

對線程進行一些簡單的管理,比如:延時執行、定時循環執行的策略等,運用線程池都能進行很好的實現。

如何向線程池中提交任務

可以通過execute()或submit()兩個方法向線程池提交任務。

execute()方法沒有返回值,所以無法判斷任務知否被線程池執行成功。

submit()方法返回一個future,那么我們可以通過這個future來判斷任務是否執行成功,通過future的get方法來獲取返回值。

如何關閉線程池

可以通過shutdown()或shutdownNow()方法來關閉線程池。

shutdown的原理是只是將線程池的狀態設置成SHUTDOWN狀態,然后中斷所有沒有正在執行任務的線程。

shutdownNow的原理是遍歷線程池中的工作線程,然后逐個調用線程的interrupt方法來中斷線程,所以無法響應中斷的任務可能永遠無法終止。shutdownNow會首先將線程池的狀態設置成STOP,然后嘗試停止所有的正在執行或暫停任務的線程,并返回等待執行任務的列表。

程序員常見的Java線程池面試題

以上就是動力節點Java培訓機構小編介紹的“程序員常見的Java線程池面試題”的內容,希望對大家有幫助,如有疑問,請在線咨詢,有專業老師隨時為你服務。

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

免費課程推薦 >>
技術文檔推薦 >>
主站蜘蛛池模板: 欧美精品三级在线 | 国产小视频在线免费观看 | 羞羞视频在线看免费 | 成人免费公开视频 | 欧美在线导航 | 日日摸夜夜添夜夜添人人爽 | 韩日色| 久久国产精品亚洲va麻豆 | 国产二区三区毛片 | 国产精品天天看特色大片不卡 | 欧美1页| 欧美小视频在线观看 | 特级深夜a级毛片免费观看 特级中国aaa毛片 | 亚洲欧美视频网站 | 97碰视频人人做人人爱欧美 | 91精品视频在线播放 | 亚洲欧美日韩在线中文一 | 动漫美女胸被狂揉扒开吃奶动态图 | 欧美一级在线看 | 一级一级一级毛片 | 亚洲国产成人久久一区www妖精 | 中文字幕日韩精品麻豆系列 | 免费一级欧美片在线观免看 | 国产综合精品日本亚洲777 | 亚洲欧美视频在线播放 | 欧美人与动交tv | 国产成人精品免费视频软件 | 瑟瑟网站免费网站入口 | 九九热视频精品在线 | 欧美韩国日本在线观看 | 性欧美xxx在线观看 性欧美疯狂猛交69hd | 国产精品成人免费视频 | 欧美日韩一区在线观看 | 天天天夜夜夜夜夜 | 国产成人ae在线观看网站站 | 久久久精品视频直接观看 | 中文字幕日韩专区精品系列 | 国产精品久久久久久久久久一区 | 伦理片中文字幕2019在线 | 亚洲人成网国产最新在线 | 一区二区三区在线播放 |