Java執行緒池原理及分析

itread01 2020-11-06 01:28:57
java 原理 分析


執行緒池是很常用的併發框架,幾乎所有需要非同步和併發處理任務的程式都可用到執行緒池。 **使用執行緒池的好處如下**: 1. 降低資源消耗:可重複利用已建立的執行緒池,降低建立和銷燬帶來的消耗; 1. 提高響應速度:任務到達時,可立即執行,無需等待執行緒建立; 1. 提高執行緒的可管理性:執行緒池可對執行緒統一分配、調優和監控。 ## 原理 執行緒池的原理非常簡單,這裡用處理流程來概括: 1. 執行緒池判斷核心池裡的執行緒是否都在執行任務,如果不是,建立一個新的執行緒來執行任務; 1. 如果核心執行緒池已滿,則將新任務存在工作佇列中; 1. 如果工作佇列滿了,執行緒數量沒有達到執行緒池上限的前提下,新建一個執行緒來執行任務; 1. 執行緒數量達到上限,則觸發飽和策略來處理這個任務; 使用工作佇列,是為了儘可能降低執行緒建立的開銷。工作佇列用阻塞佇列來實現。 ### 阻塞佇列 阻塞佇列(BlockingQueue)是指支援阻塞的插入和移除元素的佇列。 - 阻塞的插入:當佇列滿時,阻塞插入元素的執行緒,直到佇列不滿; - 阻塞的移除:當佇列為空,阻塞移除元素的線層,直到佇列不為空; 原理:**使用通知者模式**實現。當生產者往滿的佇列中新增元素時,會阻塞生產者。消費者移除元素時,會通知生產者當前佇列可用。 阻塞佇列有以下三種類型,分別是: - 有界阻塞佇列:ArrayBlockingQueue(陣列),LinkedBlockingQueue(連結串列) - 無界阻塞佇列:LinkedTransferQueue(連結串列),PriorityBlockingQueue(支援優先順序排序),DelayQueue(支援延時獲取元素的無界阻塞佇列) - 同步移交佇列:SynchronousQueue #### 有界阻塞佇列 主要包括ArrayBlockingQueue(陣列),LinkedBlockingQueue(連結串列)兩種。有界佇列大小與執行緒數量大小相互配合,佇列容量大執行緒數量小時,可減少上下文切換降低cpu使用率,但是會降低吞吐量。 #### 無界阻塞佇列 比較常用的是LinkedTransferQueue。FixedThreadPool就是用這個實現的。無界阻塞佇列要慎重使用,因為在某些情況,可能會導致大量的任務堆積到佇列中,導致記憶體飆升。 #### 同步移交佇列 SynchronousQueue。不儲存元素的阻塞佇列,每一個put操作必須等待一個take操作,否則不能繼續新增元素。用於實現CachedThreadPool執行緒池。 各個執行緒池所使用的任務佇列對映關係如下: 執行緒池 | 阻塞佇列 ---|--- FixedThreadPool | LinkedBlockingQueue SingleThreadExecutor | LinkedBlockingQueue CachedThreadExecutor | SynchronousQueue ScheduledThreadPoolExecutor | LinkedBlockingQueue ## 實現類分析 ThreadPoolExecutor是Java執行緒池的實現類,是Executor介面派生出來的最核心的類。依賴關係圖如下: ![image](https://qiniu.debrisflow.cn/20201104Executor.png) 這裡不得不提到Executor框架,該框架包含三大部分,如下: - 任務。被執行任務需要實現的介面:Runnable和Callable; - 任務執行。即上述核心介面Executor以及繼承而來的ExecutorService。ExecutorService派生出如下兩個類: - ThreadPoolExecutor:執行緒池核心實現類; - ScheduledThreadPoolExecutor:用來做定時任務; - 非同步計算的結果。介面Future和實現Future介面的FutureTask類。 ### 執行緒池建立 ``` new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, milliseconds, runnableTaskQueue, handler) ``` 構造方法如下: ``` public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, Block
版权声明
本文为[itread01]所创,转载请带上原文链接,感谢
https://www.itread01.com/content/1604511184.html

  1. 【计算机网络 12(1),尚学堂马士兵Java视频教程
  2. 【程序猿历程,史上最全的Java面试题集锦在这里
  3. 【程序猿历程(1),Javaweb视频教程百度云
  4. Notes on MySQL 45 lectures (1-7)
  5. [computer network 12 (1), Shang Xuetang Ma soldier java video tutorial
  6. The most complete collection of Java interview questions in history is here
  7. [process of program ape (1), JavaWeb video tutorial, baidu cloud
  8. Notes on MySQL 45 lectures (1-7)
  9. 精进 Spring Boot 03:Spring Boot 的配置文件和配置管理,以及用三种方式读取配置文件
  10. Refined spring boot 03: spring boot configuration files and configuration management, and reading configuration files in three ways
  11. 精进 Spring Boot 03:Spring Boot 的配置文件和配置管理,以及用三种方式读取配置文件
  12. Refined spring boot 03: spring boot configuration files and configuration management, and reading configuration files in three ways
  13. 【递归,Java传智播客笔记
  14. [recursion, Java intelligence podcast notes
  15. [adhere to painting for 386 days] the beginning of spring of 24 solar terms
  16. K8S系列第八篇(Service、EndPoints以及高可用kubeadm部署)
  17. K8s Series Part 8 (service, endpoints and high availability kubeadm deployment)
  18. 【重识 HTML (3),350道Java面试真题分享
  19. 【重识 HTML (2),Java并发编程必会的多线程你竟然还不会
  20. 【重识 HTML (1),二本Java小菜鸟4面字节跳动被秒成渣渣
  21. [re recognize HTML (3) and share 350 real Java interview questions
  22. [re recognize HTML (2). Multithreading is a must for Java Concurrent Programming. How dare you not
  23. [re recognize HTML (1), two Java rookies' 4-sided bytes beat and become slag in seconds
  24. 造轮子系列之RPC 1:如何从零开始开发RPC框架
  25. RPC 1: how to develop RPC framework from scratch
  26. 造轮子系列之RPC 1:如何从零开始开发RPC框架
  27. RPC 1: how to develop RPC framework from scratch
  28. 一次性捋清楚吧,对乱糟糟的,Spring事务扩展机制
  29. 一文彻底弄懂如何选择抽象类还是接口,连续四年百度Java岗必问面试题
  30. Redis常用命令
  31. 一双拖鞋引发的血案,狂神说Java系列笔记
  32. 一、mysql基础安装
  33. 一位程序员的独白:尽管我一生坎坷,Java框架面试基础
  34. Clear it all at once. For the messy, spring transaction extension mechanism
  35. A thorough understanding of how to choose abstract classes or interfaces, baidu Java post must ask interview questions for four consecutive years
  36. Redis common commands
  37. A pair of slippers triggered the murder, crazy God said java series notes
  38. 1、 MySQL basic installation
  39. Monologue of a programmer: despite my ups and downs in my life, Java framework is the foundation of interview
  40. 【大厂面试】三面三问Spring循环依赖,请一定要把这篇看完(建议收藏)
  41. 一线互联网企业中,springboot入门项目
  42. 一篇文带你入门SSM框架Spring开发,帮你快速拿Offer
  43. 【面试资料】Java全集、微服务、大数据、数据结构与算法、机器学习知识最全总结,283页pdf
  44. 【leetcode刷题】24.数组中重复的数字——Java版
  45. 【leetcode刷题】23.对称二叉树——Java版
  46. 【leetcode刷题】22.二叉树的中序遍历——Java版
  47. 【leetcode刷题】21.三数之和——Java版
  48. 【leetcode刷题】20.最长回文子串——Java版
  49. 【leetcode刷题】19.回文链表——Java版
  50. 【leetcode刷题】18.反转链表——Java版
  51. 【leetcode刷题】17.相交链表——Java&python版
  52. 【leetcode刷题】16.环形链表——Java版
  53. 【leetcode刷题】15.汉明距离——Java版
  54. 【leetcode刷题】14.找到所有数组中消失的数字——Java版
  55. 【leetcode刷题】13.比特位计数——Java版
  56. oracle控制用户权限命令
  57. 三年Java开发,继阿里,鲁班二期Java架构师
  58. Oracle必须要启动的服务
  59. 万字长文!深入剖析HashMap,Java基础笔试题大全带答案
  60. 一问Kafka就心慌?我却凭着这份,图灵学院vip课程百度云