Java多线程系列——线程池原理之 ThreadPoolExecutor
ThreadPoolExecutor 简介
ThreadPoolExecutor 是线程池类。
通俗的讲,它是一个存放一定数量线程的线程集合。线程池允许多个线程同时运行,同时运行的线程数量就是这个线程池的容量,也会有一部分线程出现阻塞,线程池此时也会通过响应的拒绝策略来处理。
构造函数参数说明
- corePoolSize:池中所保存的线程数,包括空闲线程
- maximumPoolSize:池中允许的最大线程数
- keepAliveTime:当线程数大于核心时,此为终止前多余的空闲线程等待新任务的最长时间
- unit:keepAliveTime 参数的时间单位
- workQueue:执行前用于保持任务的队列(被提交但尚未执行的任务)。此队列仅保存由 execute 方法提交的 Runable 任务
- threadFactory:执行程序创建新线程时使用的工厂
- handler:拒绝策略,由于超出线程范围和队列容量而使执行被阻塞时所使用的处理程序
corePoolSize 与 maximumPoolSize 的关系
如果运行线程数少于 corePoolSize,则 Executor 始终首选添加新的线程,而不进行排队;
如果运行的线程大于等于 corePoolSize,则 Executor 始终首选将请求加入阻塞队列,而不添加新的线程;
如果无法将请求加入队列,则创建新的线程,如果创建此线程超出 maximumPoolSize,在这种情况下,任务将被拒绝;
如果设置的 corePoolSize 和 maximumPoolSize 相同,则创建了固定大小的线程池。如果将 maximumPoolSize 设置为基本的无界值(Integer.MAX_VALUE),则允许池适应任意数量的并发任务,直到内存耗尽。在大都数情况下,核心池大小和最大池大小在创建线程池时设置,不过也可以通过 setCorePoolSize() 和 setMaximumPoolSize() 进行动态更改。
ThreadPoolExecutor 的数据结构
- workers:workers 为 HashSet<Worker> 类型。一个 Worker 对应一个线程,线程池通过 workers 包含了多个线程。当线程池启动时,它会执行线程池中的任务,执行完后,它会从线程池的阻塞队列中取出阻塞任务来执行。线程池通过它实现了“允许多线程同时运行”
- workQueue:workQueue 为 BlockingQueue<Runnable> 阻塞队列类型。当线程池中的线程数超过它的容量时,线程会进入阻塞队列进行阻塞等待。线程池通过它实现了线程阻塞功能
- mainLock:Condition 类型,通过它实现了线程池的互斥访问
- corePoolSize:核心池大小
- maximumPoolSize:最大池大小
- poolSize:当前线程池的实际大小,即线程池中的任务数量
线程池通过 workers 集合来管理多线程,线程启动后,就会执行对应的任务。任务执行完毕后,它会从阻塞队列中取出任务继续执行。阻塞队列负责管理线程池来不及处理的任务,当添加线程池被添加到最大线程池大小时,就会执行拒绝策略(handler),来处理当前提交但被拒绝的任务。
Java多线程系列——线程池原理之 ThreadPoolExecutor的更多相关文章
- Java多线程系列——线程池简介
什么是线程池? 为了避免系统频繁地创建和销毁线程,我们可以让创建的线程进行复用.用线程时从线程池中获取,用完以后不销毁线程,而是归还给线程池. JDK 对线程池的支持 为了更好的控制多线程,JDK 提 ...
- java多线程:线程池原理、阻塞队列
一.线程池定义和使用 jdk 1.5 之后就引入了线程池. 1.1 定义 从上面的空间切换看得出来,线程是稀缺资源,它的创建与销毁是一个相对偏重且耗资源的操作,而Java线程依赖于内核线程,创建线程需 ...
- java并发包&线程池原理分析&锁的深度化
java并发包&线程池原理分析&锁的深度化 并发包 同步容器类 Vector与ArrayList区别 1.ArrayList是最常用的List实现类,内部是通过数组实现的, ...
- Java多线程与线程池技术
一.序言 Java多线程编程线程池被广泛使用,甚至成为了标配. 线程池本质是池化技术的应用,和连接池类似,创建连接与关闭连接属于耗时操作,创建线程与销毁线程也属于重操作,为了提高效率,先提前创建好一批 ...
- Java 多线程:线程池
Java 多线程:线程池 作者:Grey 原文地址: 博客园:Java 多线程:线程池 CSDN:Java 多线程:线程池 工作原理 线程池内部是通过队列结合线程实现的,当我们利用线程池执行任务时: ...
- Java 多线程之线程池的使用
一. 使用背景 谈到Java多线程,我们很自然的会想到并发,在编写多线程代码时,我们一般会创建多个线程,如果并发的线程数量很多,而且每个线程都是执行一个时间很短的任务就结束了,这样频繁的进行线程的创建 ...
- java多线程、线程池及Spring配置线程池详解
1.java中为什么要使用多线程使用多线程,可以把一些大任务分解成多个小任务来执行,多个小任务之间互不影像,同时进行,这样,充分利用了cpu资源.2.java中简单的实现多线程的方式 继承Thread ...
- Java并发包--线程池原理
转载请注明出处:http://www.cnblogs.com/skywang12345/p/3509954.html 线程池示例 在分析线程池之前,先看一个简单的线程池示例. 1 import jav ...
- Java多线程之线程池详解
前言 在认识线程池之前,我们需要使用线程就去创建一个线程,但是我们会发现有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因 ...
随机推荐
- Java开发人员必须掌握的Linux命令(一)
子曰:"工欲善其事,必先利其器." 1.登录服务器SSH命令 简单说,SSH是一种网络协议,用于计算机之间的加密登录.如果一个用户从本地计算机,使用SSH协议登录另一台远程计算机, ...
- SQL Server 限定删除一行
with t as ( )* from testtest where aa='aa' order by bb ) delete from t
- Django models字段查询谓词表
谓词 含义 示例 等价SQL语句 exact 精确等于 Comment.objects.filter(id__exact=14) select * from Comment where id=14 i ...
- Microsoft Corporation 去掉 windows 修改 启动加载 版权
windows 修改 开机界面 boot启动界面 windows 修改 启动加载 版权 windows 系统如何修改开机画面的版权文字“Microsoft Corporation ... ◎Micro ...
- 2331: [SCOI2011]地板 插头DP
国际惯例的题面:十分显然的插头DP.由于R*C<=100,所以min(R,C)<=10,然后就可以愉悦地状压啦.我们用三进制状压,0表示没有插头,1表示有一个必须延伸至少一格且拐弯的插头, ...
- 洛谷.3374.[模板]树状数组1(CDQ分治)
题目链接 简易CDQ分治教程 //每个操作分解为一个有序数对(t,p),即(时间,操作位置),时间默认有序,用CDQ分治处理第二维 //对于位置相同的操作 修改优先于查询 //时间是默认有序的 所以可 ...
- “IT学子成长指导”专栏及文章目录 —贺利坚
迂者专栏关键词 就 业 大一 大二 大三 大四 自学 职 场 专业+兴趣 研究生 硕士 规 划 考 研 大学生活 迷 茫 计算机+专业 基本功 学习方法 编程 基 础 实践 读书 前 途 成 长 社团 ...
- HTML5开发学习:本地存储Web Sql Database
Web Sql Database,中文翻译作"本地数据库",是随着HTML5规范加入的在浏览器端运行的轻量级数据库. 在HTML5中,大大丰富了客户端本地可以存储的内容 ...
- Facebook's React vs AngularJS: A Closer Look
When we launched React | A JavaScript library for building user interfaces two weeks ago there were ...
- 内核同步机制-RCU同步机制
转自:https://blog.csdn.net/nevil/article/details/7718375 转自http://www.360doc.com/content/09/0805/00/36 ...