Java并发编程的艺术(十一)——Executor与线程池
Executor框架简介
从JDK5开始,把工作单元和执行机制分离开来了,工作的单元包括Runnable和Callable,执行机制就是由Executor框架提供。
Executor两级调度模型
HotSpot虚拟机将Java线程映射为操作系统的线程。
在上层,Java多线程程序将应用分解为多个任务,然后由用户级的调度器Executor将这些任务映射为固定数量的线程。
在底层,操作系统将这些线程映射到硬件处理器上。

Executor结构与成员
结构由三大部分组成:
- 任务:包括被执行任务所需要实现的接口:Runnable, Callable。
- 任务的执行:核心接口时Executor,以及继承了它的ExecutorService接口。ExecutorService有两个关键类,ThreadPoolExecutor和ScheduledThreadPoolExecutor。
- 执行结果:包括Future接口及其实现类FutureTask。

线程池相关
1.FixedThreadPool

代码实现
public static ExecutorService newFixedThreadPool(int nThreads){
return new ThreadPoolExecutor(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>());
}
这里把keepAliveTime设置为0L,超过核心数的多余的线程会立即停止。
特点
- 线程数固定。
- corePoolSize和maximunPoolSize都为用户设定的线程数量nThreads,则超出无法创建超出核心数量的工作线程。
- 堵塞队列采用LinkedBlockingQueue,无界队列。
- 采用无界队列,就不会拒绝任务,同时maximumPoolSize和keepAliveTime参数将无效。
2.SingleThreadPool

使用方法
public static ExecutorService newSingleThreadExecutor(){
return new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>());
}
特点
- 只有一条工作线程。
- 采用阻塞队列为LinkedBlockingQueue。
3.CachedThreadPool

代码实现
public static ExecutorService newCachedThreadPool(){
return new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.MILLISECONDS, new SynchronousQueue<Runnable>());
}
特点
- 可以无限扩大。
- 适合处理执行时间小任务。
- 核心线程数为0,而最大线程数无限大,这样线程数量可以无限扩大。
- 超时时间时60s,这样空闲线程等待60秒后就会被销毁。
- 阻塞队列采用SynchronousQueue。这个队列没有存储空间,所以,如果有任务到来,就不会被入队,直接新建线程拿去运行。
4.ScheduledThreadPool

特点
- 用于执行延时或者定时任务
- 采用DelayQueue阻塞队列,内部其实由PriorityQueue实现,并根据时间排序,时间相同则根据序号排序,也是无界队列。
- 需要确定任务开始时间,任务序列号,任务执行的时间间隔。
- 如果是周期任务,则执行完又放回队列。
Java并发编程的艺术(十一)——Executor与线程池的更多相关文章
- Java并发编程的艺术(十一)——线程池(2)
Executor两级调度模型 在HotSpot虚拟机中,Java中的线程将会被一一映射为操作系统的线程. 在Java虚拟机层面,用户将多个任务提交给Executor框架,Executor负责分配线程执 ...
- Java并发编程(三)什么是线程池
什么是线程池 学习编程的小伙伴们会经常听到“线程池”.“连接池”这类的词语,可是到底“池”是什么意思呢?我讲个故事大家就理解了:在很久很久以前有一家银行,一年之中只有一个客户来办理业务,随着时间的推移 ...
- Java并发编程(八):线程调度——线程池
new Thread的弊端 执行一个异步任务你还只是如下new Thread吗? new Thread(new Runnable() { @Override public void run() { / ...
- 【java并发编程实战】第八章:线程池的使用
1.线程饥饿锁 定义:在线程池中,如果任务的执行依赖其他任务,那么可能会产生线程饥饿锁.尤其是单线程线程池. 示例: public class ThreadDeadStarveTest { publi ...
- Java并发编程的艺术(七)——线程间的通信
为什么需要线程间通信 让线程之间合作,提高运行效率. volatile和synchronized关键字 实现原理 这两个方式都是采用共享内存的方式进行通信,通过同步机制保证数据可见性和排他性. 特点 ...
- Java并发编程的艺术(五)——线程和线程的状态
线程 什么是线程 操作系统调度的最小单元就是线程,也叫轻量级进程. 为什么要使用多线程 多线程程序能够更有效率地利用多处理器核心. 用户响应时间更快. 方便程序员将程序模型映射到Java提供的多线程编 ...
- 那些年读过的书《Java并发编程实战》和《Java并发编程的艺术》三、任务执行框架—Executor框架小结
<Java并发编程实战>和<Java并发编程的艺术> Executor框架小结 1.在线程中如何执行任务 (1)任务执行目标: 在正常负载情况下,服务器应用 ...
- 读《Java并发编程的艺术》(一)
离开博客园很久了,自从找到工作,到现在基本没有再写过博客了.在大学培养起来的写博客的习惯在慢慢的消失殆尽,感觉汗颜.所以现在要开始重新培养起这个习惯,定期写博客不仅是对自己学习知识的一种沉淀,更是在督 ...
- Java并发编程的艺术读书笔记(2)-并发编程模型
title: Java并发编程的艺术读书笔记(2)-并发编程模型 date: 2017-05-05 23:37:20 tags: ['多线程','并发'] categories: 读书笔记 --- 1 ...
随机推荐
- OWASP固件安全性测试指南
OWASP固件安全性测试指南 固件安全评估,英文名称 firmware security testing methodology 简称 FSTM.该指导方法主要是为了安全研究人员.软件开发人员.顾问. ...
- web安全原理分析-SQL注入漏洞全解
简介 靶场:榆林学院信息安全协会--入侵榆大实验靶场 数字型注入 1 字符型注入 1 布尔注入 1.布尔注入简介 mysql bool注入是盲注的一种.与报错注入不同,bool注入没有任何报错信息输出 ...
- kali 系列学习01 - 安装、vmtools、ssh服务和共享文件夹
Kali介绍Kali Linux是基于Debian的Linux发行版, 设计用于数字取证操作系统.面向专业的渗透测试和安全审计,超过300个渗透测试工具一.安装 1.在虚拟机中安装,详见 https: ...
- sqlilab less19-less22
less19 当账号密码正确时,会将当前的refer和ip存入数据库.对这两个值同时没有进行过滤.考虑使用sqlmap对这两个参数进行注入 less-20 当cookie uname存在时,并且不是p ...
- php 判断网站是http还是https
//判断是http还是https $http_type = ((isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') || (i ...
- 使用Beyond Compare对比大篇幅文件的小技巧
我们在编辑较大篇幅的文章时,无可避免地要经过多次的修改.有时候修改的版本过多时,我们很可能就会记不清最新版的文章对比上一版的文章,究竟修改了哪些地方.但有了Beyond Compare(Windows ...
- ABBYY FineReader如何将图片转换为Excel
ABBYY FineReader的OCR文字识别功能很强大,不但可以将文件转换为文本文档或Word文档,也可以识别PDF文件或者图片上的表格,并且转换为Excel文件.下面我就为大家演示一下怎么用AB ...
- Vuex form表单处理, 比官网更好的办法
Vuex form表单处理, 比官网更好的办法 问题, 当使用vuex的state作为表单的v-model元素, 虽然简单粗暴, 但这种修改没有经过mutation方法. 在严格模式下会抛出错误 目录 ...
- 推荐系统实践 0x07 基于邻域的算法(2)
基于邻域的算法(2) 上一篇我们讲了基于用户的协同过滤算法,基本流程就是寻找与目标用户兴趣相似的用户,按照他们对物品喜好的对目标用户进行推荐,其中哪些相似用户的评分要带上目标用户与相似用户的相似度作为 ...
- Java反射——java.lang.Class和类的加载
反射的基础: java.lang.Class Class类的实例对象,用于记录类描述信息. 源码说:represent classes and interfaces in a running Java ...