原文链接:http://www.studyshare.cn/blog-front/blog/details/1133

一、java中提供的线程在开发中可能并不会直接使用,多线程编程场景使用java的线程池会更好,因为可以很好的管理线程,并且线程池内部的机制节省了我们自己创建和销毁线程的时间,效率上来讲更高。那么线程池内部实现的机制是怎样的呢?

首先看一张图:

线程池内部实现机制

先解释每个元素的含义,然后整体总结机制

1、BlockingQueue<Runnable>

这是java jdk提供的阻塞队列,在这里是用来存放用户提交的任务

2、corePool

这是线程池中的核心线程,一个线程池中,首先使用这些核心线程去处理用户递交过来的任务

3、maximumPool

这是线程池中允许创建的最大的线程数

4、RejectedExecutionHandler

这是线程池提供的饱和策略,提供了四种策略,含义分别如下

AbortPolicy:直接抛出异常,默认使用

CallerRunsPolicy:使用调用者的线程执行任务

DiscardPolicy:直接丢弃任务

DiscardOldPolicy:丢弃最老的任务

5、execute()

该方法是线程池提供给外部调用的方法,使用者可通过调用该方法实现将任务交给线程池去执行

搞明白以上内容的所有含义,下面分四步整体说明线程池的执行流程和机制:

1、当外部的任务数提交到线程池中,任务数小于线程池的核心线程数的时候,就创建核心线程去执行任务

2、当任务数大于等于核心线程数的时候,将任务存入阻塞队列

3、当阻塞队列也已经存满了,则去创建新的线程来执行任务,但创建的新的线程数量不超过线程池的最大线程数

4、如果任务队列满了,线程池的线程也达到了最大线程数,此时还有新的任务递交到线程池怎么办?

5、使用饱和策略,具体使用哪种策略根据任务来确定,线程池默认是直接抛出异常

以上就是线程池内部的具体实现机制。

更多深度技术好文:http://www.studyshare.cn/blog-front//index

java线程池的实现机制的更多相关文章

  1. Java线程池使用说明

    Java线程池使用说明 转自:http://blog.csdn.net/sd0902/article/details/8395677 一简介 线程的使用在java中占有极其重要的地位,在jdk1.4极 ...

  2. (转载)JAVA线程池管理

    平时的开发中线程是个少不了的东西,比如tomcat里的servlet就是线程,没有线程我们如何提供多用户访问呢?不过很多刚开始接触线程的开发攻城师却在这个上面吃了不少苦头.怎么做一套简便的线程开发模式 ...

  3. Java线程池的原理及几类线程池的介绍

    刚刚研究了一下线程池,如果有不足之处,请大家不吝赐教,大家共同学习.共同交流. 在什么情况下使用线程池? 单个任务处理的时间比较短 将需处理的任务的数量大 使用线程池的好处: 减少在创建和销毁线程上所 ...

  4. [转 ]-- Java线程池使用说明

    Java线程池使用说明 原文地址:http://blog.csdn.net/sd0902/article/details/8395677 一简介 线程的使用在java中占有极其重要的地位,在jdk1. ...

  5. Java线程池学习

    Java线程池学习 Executor框架简介 在Java 5之后,并发编程引入了一堆新的启动.调度和管理线程的API.Executor框架便是Java 5中引入的,其内部使用了线程池机制,它在java ...

  6. java线程池的使用与详解

    java线程池的使用与详解 [转载]本文转载自两篇博文:  1.Java并发编程:线程池的使用:http://www.cnblogs.com/dolphin0520/p/3932921.html   ...

  7. 07深入理解Java线程池

    之前面试baba系时遇到一个相对简单的多线程编程题,即"3个线程循环输出ADC",自己答的并不是很好,深感内疚,决定更加仔细的学习<并发编程的艺术>一书,到达掌握的强度 ...

  8. Java线程池ThreadPoolExector的源码分析

    前言:线程是我们在学习java过程中非常重要的也是绕不开的一个知识点,它的重要程度可以说是java的核心之一,线程具有不可轻视的作用,对于我们提高程序的运行效率.压榨CPU处理能力.多条线路同时运行等 ...

  9. Java线程池使用和常用参数

    多线程问题: 1.java中为什么要使用多线程使用多线程,可以把一些大任务分解成多个小任务来执行,多个小任务之间互不影像,同时进行,这样,充分利用了cpu资源. 2.java中简单的实现多线程的方式 ...

随机推荐

  1. 关于pycharm中缩进、粘贴复制等文本编辑功能部分失效的解决办法

    有可能是同时安装了vim,冲突导致: 在seetings中点击Plugins,搜索vim卸载后功能恢复

  2. 使用OpenLDAP部署目录服务

  3. 使用 Flask-Docs 自动生成 Api 文档

    影响我写文档的原因可能是代码和文档分离,有时候写完代码会忘记补文档,而且不能及时查看,使用 Flask-Docs 可以解决我的问题,这个插件可以根据代码注释生成文档页面,代码注释改动文档可以及时更新, ...

  4. zabbix使用邮箱告警

    目的:使用自己的邮箱(目前我使用的是腾讯企业邮箱)发送告警邮件 1.配置Email:管理->报警媒介类型->Email->修改对应Email参数 2.修改admin用户的报警媒介Em ...

  5. ELK实践-Kibana定制化扩展

    纵观任何一家大数据平台的技术架构,总少不了ElasticSearch:ES作为溶合了后端存储.快速检索.OLAP分析等功能的一套开源组件,更绝的是提供了一套集数据采集与前端展现为一体的框架(即ELK) ...

  6. MySQL运行内存不足时应采取的措施?

    排除故障指南:MySQL运行内存不足时应采取的措施? 天一阁@ 老叶茶馆 1周前 导读 排除故障指南:MySQL运行内存不足时应采取的措施? 翻译团队:知数堂藏经阁项目 - 天一阁 团队成员:天一阁- ...

  7. 管理mysql数据的两条sql tips

    当从B表数据更新到A表时: update A inner join B on A.aid=B.aid set A.user_name=B.username,A.phone=B.telwhere A.a ...

  8. Spring3基础原理解析

    一.Spring3主要含义 Spring3是一个轻量级的控制反转(IOC)和面向切面(AOP)的容器框架. 注:IOC的作用:对象依赖的其他对象通过被动的形式传递进来而不是这个对象常见或者查找依赖对象 ...

  9. SpringBoot启动源码探究----configureHeadlessProperty()方法

    该方法只做了一件事:设置了一个名为java.awt.headless的系统属性,源码如下: private void configureHeadlessProperty() { System.setP ...

  10. Kubernetes的三种外部访问方式:NodePort、LoadBalancer和Ingress(转发)

    原文 http://cloud.51cto.com/art/201804/570386.htm Kubernetes的三种外部访问方式:NodePort.LoadBalancer和Ingress 最近 ...