没有合适的资源?快使用搜索试试~ 我知道了~
资源详情
资源评论
资源推荐
2019/6/22 深入理解Java线程池:ThreadPoolExecutor | Idea Buffer
www.ideabuffer.cn/2017/04/04/深入理解Java线程池:ThreadPoolExecutor/ 1/24
Idea Buffer
2017-04-04 | 开发手册 , J.U.C |
线程池介绍
在web开发中,服务器需要接受并处理请求,所以会为一个请求来分配一个线程来进行处理。如果每次请求都
新创建一个线程的话实现起来非常简便,但是存在一个问题:
如果并发的请求数量非常多,但每个线程执行的时间很短,这样就会频繁的创建和销毁线程,如此一来会大大
降低系统的效率。可能出现服务器在为每个请求创建新线程和销毁线程上花费的时间和消耗的系统资源要比处
理实际的用户请求的时间和资源更多。
那么有没有一种办法使执行完一个任务,并不被销毁,而是可以继续执行其他的任务呢?
这就是线程池的目的了。线程池为线程生命周期的开销和资源不足问题提供了解决方案。通过对多个任务重用
线程,线程创建的开销被分摊到了多个任务上。
什么时候使用线程池?
单个任务处理时间比较短
需要处理的任务数量很大
使用线程池的好处
引用自 http://ifeve.com/java-threadpool/ 的说明:
降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。
提高响应速度。当任务到达时,任务可以不需要的等到线程创建就能立即执行。
提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳
定性,使用线程池可以进行统一的分配,调优和监控。
Java中的线程池是用ThreadPoolExecutor类来实现的. 本文就结合JDK 1.8对该类的源码来分析一下这个类内
部对于线程的创建, 管理以及后台任务的调度等方面的执行原理。
深入理解Java线程池:ThreadPoolExecutor
2019/6/22 深入理解Java线程池:ThreadPoolExecutor | Idea Buffer
www.ideabuffer.cn/2017/04/04/深入理解Java线程池:ThreadPoolExecutor/ 2/24
先看一下线程池的类图:
Executor框架接口
Executor框架是一个根据一组执行策略调用,调度,执行和控制的异步任务的框架,目的是提供一种将”任务
提交”与”任务如何运行”分离开来的机制。
J.U.C中有三个Executor接口:
Executor:一个运行新任务的简单接口;
ExecutorService:扩展了Executor接口。添加了一些用来管理执行器生命周期和任务生命周期的方
法;
ScheduledExecutorService:扩展了ExecutorService。支持Future和定期执行任务。
Executor接口
1
2
3
public interface Executor {
void execute(Runnable command);
}
2019/6/22 深入理解Java线程池:ThreadPoolExecutor | Idea Buffer
www.ideabuffer.cn/2017/04/04/深入理解Java线程池:ThreadPoolExecutor/ 3/24
Executor接口只有一个execute方法,用来替代通常创建或启动线程的方法。例如,使用Thread来创建并启动
线程的代码如下:
1
2
Thread t = new Thread();
t.start();
使用Executor来启动线程执行任务的代码如下:
1
2
Thread t = new Thread();
executor.execute(t);
对于不同的Executor实现,execute()方法可能是创建一个新线程并立即启动,也有可能是使用已有的工作线
程来运行传入的任务,也可能是根据设置线程池的容量或者阻塞队列的容量来决定是否要将传入的线程放入阻
塞队列中或者拒绝接收传入的线程。
ExecutorService接口
ExecutorService接口继承自Executor接口,提供了管理终止的方法,以及可为跟踪一个或多个异步任务执行
状况而生成 Future 的方法。增加了shutDown(),shutDownNow(),invokeAll(),invokeAny()和submit()
等方法。如果需要支持即时关闭,也就是shutDownNow()方法,则任务需要正确处理中断。
ScheduledExecutorService接口
ScheduledExecutorService扩展ExecutorService接口并增加了schedule方法。调用schedule方法可以在指
定的延时后执行一个Runnable或者Callable任务。ScheduledExecutorService接口还定义了按照指定时间间
隔定期执行任务的scheduleAtFixedRate()方法和scheduleWithFixedDelay()方法。
ThreadPoolExecutor分析
ThreadPoolExecutor继承自AbstractExecutorService,也是实现了ExecutorService接口。
几个重要的字段
1
2
3
4
5
6
private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0));
private static final int COUNT_BITS = Integer.SIZE - 3;
private static final int CAPACITY = (1 << COUNT_BITS) - 1;
// runState is stored in the high-order bits
private static final int RUNNING = -1 << COUNT_BITS;
2019/6/22 深入理解Java线程池:ThreadPoolExecutor | Idea Buffer
www.ideabuffer.cn/2017/04/04/深入理解Java线程池:ThreadPoolExecutor/ 4/24
7
8
9
10
private static final int SHUTDOWN = 0 << COUNT_BITS;
private static final int STOP = 1 << COUNT_BITS;
private static final int TIDYING = 2 << COUNT_BITS;
private static final int TERMINATED = 3 << COUNT_BITS;
ctl 是对线程池的运行状态和线程池中有效线程的数量进行控制的一个字段, 它包含两部分的信息: 线程池的
运行状态 (runState) 和线程池内有效线程的数量 (workerCount),这里可以看到,使用了Integer类型来保
存,高3位保存runState,低29位保存workerCount。COUNT_BITS 就是29,CAPACITY就是1左移29位减
1(29个1),这个常量表示workerCount的上限值,大约是5亿。
下面再介绍下线程池的运行状态. 线程池一共有五种状态, 分别是:
1. RUNNING :能接受新提交的任务,并且也能处理阻塞队列中的任务;
2. SHUTDOWN:关闭状态,不再接受新提交的任务,但却可以继续处理阻塞队列中已保存的任务。在线
程池处于 RUNNING 状态时,调用 shutdown()方法会使线程池进入到该状态。(finalize() 方法在执
行过程中也会调用shutdown()方法进入该状态);
3. STOP:不能接受新任务,也不处理队列中的任务,会中断正在处理任务的线程。在线程池处于
RUNNING 或 SHUTDOWN 状态时,调用 shutdownNow() 方法会使线程池进入到该状态;
4. TIDYING:如果所有的任务都已终止了,workerCount (有效线程数) 为0,线程池进入该状态后会调用
terminated() 方法进入TERMINATED 状态。
5. TERMINATED:在terminated() 方法执行完后进入该状态,默认terminated()方法中什么也没有做。
进入TERMINATED的条件如下:
线程池不是RUNNING状态;
线程池状态不是TIDYING状态或TERMINATED状态;
如果线程池状态是SHUTDOWN并且workerQueue为空;
workerCount为0;
设置TIDYING状态成功。
下图为线程池的状态转换过程:
剩余23页未读,继续阅读
士多霹雳酱
- 粉丝: 22
- 资源: 299
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 信呼OA系统2.1.7版源码
- 3122080306 邹子轩 实验报告二.docx
- 基于STM32 NUCLEO板设计彩色LED照明灯(纯cubeMX开发)(大赛作品,文档完整,可直接运行)
- 发那科工业机器人保养大全
- Sphere.h
- REMD固有时间尺度分解信号分量可视化(Matlab完整源码和数据)
- 嵌入式系统双单片机STC89C52+STC15W104多功能学习板电路图可扩展 适用于单片机初学者和教学
- 基于STM32蓝牙控制小车系统设计(硬件+源代码+论文)大赛作品
- XILINXFPGA源码基于Spartan3火龙刀系列FPGA开发板VGA测试例程
- Java聊天室的设计与实现【尚学堂·百战程序员】
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0