java院長分享出來的Java 線程池原理分析與使用

編程語言 Java 遊戲 問世間情是何物 2017-06-05

使用線程池的好處

  • 1、降低資源消耗

  • 可以重複利用已創建的線程降低線程創建和銷燬造成的消耗。

  • 2、提高響應速度

  • 當任務到達時,任務可以不需要等到線程創建就能立即執行。

  • 3、提高線程的可管理性

  • 線程是稀缺資源,如果無限制地創建,不僅會消耗系統資源,還會降低系統的穩定性,使用線程池可以進行統一分配、調優和監控

線程池的工作原理

  • 1、線程池判斷核心線程池裡的線程是否都在執行任務。如果不是,則創建一個新的工作線程來執行任務。如果核心線程池裡的線程都在執行任務,則執行第二步。

  • 2、線程池判斷工作隊列是否已經滿。如果工作隊列沒有滿,則將新提交的任務存儲在這個工作隊列裡進行等待。如果工作隊列滿了,則執行第三步

  • 3、線程池判斷線程池的線程是否都處於工作狀態。如果沒有,則創建一個新的工作線程來執行任務。如果已經滿了,則交給飽和策略來處理這個任務

線程池飽和策略

展示下線程池的工作流程圖

java院長分享出來的Java 線程池原理分析與使用

java院長分享出來的Java 線程池原理分析與使用

  • 1、如果當前運行的線程少於corePoolSize,則創建新線程來執行任務(注意,執行這一步驟需要獲取全局鎖)。

  • 2、如果運行的線程等於或多於corePoolSize,則將任務加入BlockingQueue。

  • 3、如果無法將任務加入BlockingQueue(隊列已滿),則在非corePool中創建新的線程來處理任務(注意,執行這一步驟需要獲取全局鎖)。

  • 4、如果創建新線程將使當前運行的線程超出maximumPoolSize,任務將被拒絕,並調用RejectedExecutionHandler.rejectedExecution()方法。

關鍵方法源碼分析java院長分享出來的Java 線程池原理分析與使用

由於代碼過長,需要文檔版源碼的可以來我的java群 331789133

線程池的使用

我們可以通過ThreadPoolExecutor來創建一個線程池

java院長分享出來的Java 線程池原理分析與使用

向線程池提交任務

可以使用兩個方法向線程池提交任務,分別為execute()和submit()方法。execute()方法用於提交不需要返回值的任務,所以無法判斷任務是否被線程池執行成功。

java院長分享出來的Java 線程池原理分析與使用

  • submit()方法用於提交需要返回值的任務。線程池會返回一個future類型的對象,通過這個future對象可以判斷任務是否執行成功,並且可以通過future的get()方法來獲取返回值,get()方法會阻塞當前線程直到任務完成,而使用get(long timeout,TimeUnit unit)方法則會阻塞當前線程一段時間後立即返回,這時候有可能任務沒有執行完。

java院長分享出來的Java 線程池原理分析與使用

關閉線程池

  • 可以通過調用線程池的shutdown或shutdownNow方法來關閉線程池。只要調用了這兩個關閉方法中的任意一個,isShutdown方法就會返回true。

如果大家有什麼不理解的地方,可以在評論裡面提出來,如果覺得還不錯,請點贊或者分享給你的朋友,以鼓勵我不斷前進。學習方法可以找我java學習交流 群331789133

相關推薦

推薦中...