线程池(1)ThreadPoolExecutor梳理
使用默认的 thread factory创建ThreadPoolExecutor实例
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
RejectedExecutionHandler handler)
例子:
//创建阻塞队列
BlockingQueue<Runnable> blockQueue = new ArrayBlockingQueue<Runnable>(20);
ThreadPoolExecutor pool = new ThreadPoolExecutor(3,5,50,TimeUnit.MILLISECONDS,blockQueue);
pool.allowCoreThreadTimeOut(false);//默认false
Runnable task = new Runnable() {
@Override
public void run() {
log.info("{}正在运行", Thread.currentThread().getName());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
pool.execute(task); pool.shutdown();
参数解释:
corePoolSize:线程池中的核心线程数
maximumPoolSize:线程池中的最大线程数
keepAliveTime:
- 当allowCoreThreadTimeout=false(默认)时,超过corePool的线程空闲的时间达到了keepAliveTime时间时,这些线程会超时关闭,直到线程数=corePoolSize。因此,
- corePool的线程数,是固定的且永久有效的。即,即使当前没有需要执行的任务,也依然存活。
- 当allowCoreThreadTimeout=true时,包含corePool线程的所有线程的空闲时间达到了keepAliveTime时间时,这些线程会超时关闭,直到线程数=0。因此,
- 线程池中的线程数<指定的corePool线程数时,当有新任务来时,即使有空闲线程,也会优先创先新线程来处理该任务,直到线程数=指定的corePool线程数。
workQueue:
- 保存由execute方法提交的Runnable任务。
- 阻塞队列分类:
- ArrayBlockingQueue:FIFO。
- LinkedBlockingQueue:FIFO。Executors.newFixedThreadPool使用该阻塞队列
- SynchronousQueue:不存储任务。Executors.newCachedThreadPool使用该阻塞队列。
执行顺序
当线程数<指定corePool线程数时,创建线程。
当线程数>=指定corePool线程数,且任务队列未满时,将任务放入workQueue。
当线程数>=指定corePool线程数,且任务队列已满时,
- 若线程数 < maximumPoolSize,则,创建线程
- 若线程数 = maximumPoolSize,则,执行下边的handler,默认AbortPolicy即抛出异常。
还有1种情况会执行下边的handler,即:当执行shutdown();后,新进来的任务,就会被拒绝,此时调用handler。
handler:(ThreadPoolExecutor类中的几个内部实)
- AbortPolicy(默认):丢弃任务,抛出RejectedExecutionException异常
- DiscardPolicy:也是丢弃任务,但不抛出异常
- DiscardOldestPolicy:对被拒绝的任务(新来的)不抛弃,而是抛弃队列里面等待最久的一个任务,然后把该拒绝任务加到队列
- CallerRunsPolicy:重试添加当前被拒绝的任务,他会自动重复调用 execute() 方法,直到成功。
---------------------------最后,说下关闭
shutdown():平滑地关闭
- 不会立即终止线程池
- 停止接收新任务,并等待执行已提交的任务。已提交的任务=一类是已经在执行的+另一类队列中还没执行的。
- 如果是服务器的,则不调用shutdown方法,即一直执行。
shutdownNow():立即关闭
- 立即终止线程池
- 停止接收新任务,已提交的任务直接打断,并清空缓存队列
- 返回尚未执行的任务列表(Runnable List)
线程池(1)ThreadPoolExecutor梳理的更多相关文章
- 从源码解读线程(Thread)和线程池(ThreadPoolExecutor)的状态
线程是比进程更加轻量级的调度执行单位,理解线程是理解并发编程的不可或缺的一部分:而生产过程中不可能永远使用裸线程,需要线程池技术,线程池是管理和调度线程的资源池.因为前不久遇到了一个关于线程状态的问题 ...
- Java并发编程:Java线程池核心ThreadPoolExecutor的使用和原理分析
目录 引出线程池 Executor框架 ThreadPoolExecutor详解 构造函数 重要的变量 线程池执行流程 任务队列workQueue 任务拒绝策略 线程池的关闭 ThreadPoolEx ...
- 线程池 一 ThreadPoolExecutor
java.util.concurrent public class ThreadPoolExecutor extends AbstractExecutorService ThreadPoolExecu ...
- 线程池之 ThreadPoolExecutor
线程池之 ThreadPoolExecutor + 面试题 线程池介绍 线程池(Thread Pool):把一个或多个线程通过统一的方式进行调度和重复使用的技术,避免了因为线程过多而带来使用上的开销. ...
- 高并发之——不得不说的线程池与ThreadPoolExecutor类浅析
一.抛砖引玉 既然Java中支持以多线程的方式来执行相应的任务,但为什么在JDK1.5中又提供了线程池技术呢?这个问题大家自行脑补,多动脑,肯定没坏处,哈哈哈... 说起Java中的线程池技术,在很多 ...
- 【高并发】不得不说的线程池与ThreadPoolExecutor类浅析
大家好,我是冰河~~ 今天,我们一起来简单聊聊线程池中的ThreadPoolExecutor类,好了,不多说了,开始进入今天的正题. 一.抛砖引玉 既然Java中支持以多线程的方式来执行相应的任务,但 ...
- 线程池:ThreadPoolExecutor源码解读
目录 1 带着问题去阅读 1.1 线程池的线程复用原理 1.2 线程池如何管理线程 1.3 线程池配置的重要参数 1.4 shutdown()和shutdownNow()区别 1.5 线程池中的两个锁 ...
- 线程池:ThreadPoolExecutor
[ThreadPoolExecutor的使用和思考] public ThreadPoolExecutor(int corePoolSize, ...
- Java线程池之ThreadPoolExecutor
前言 线程池可以提高程序的并发性能(当然是合适的情况下),因为对于没有线程的情况下,我们每一次提交任务都新建一个线程,这种方法存在不少缺陷: 1. 线程的创建和销毁的开销非常高,线程的创建需要时间, ...
- 从源码看JDK提供的线程池(ThreadPoolExecutor)
一丶什么是线程池 (1)博主在听到线程池三个字的时候第一个想法就是数据库连接池,回忆一下,我们在学JavaWeb的时候怎么理解数据库连接池的,数据库创建连接和关闭连接是一个比较耗费资源的事情,对于那些 ...
随机推荐
- 分享知识-快乐自己:Hibernate 中Criteria Query查询详解
1):Hibernate 中Criteria Query查询详解 当查询数据时,人们往往需要设置查询条件.在SQL或HQL语句中,查询条件常常放在where子句中. 此外,Hibernate还支持Cr ...
- python- python内置模块 面向对象
1.configparser模块 configparser用于处理特定格式的文件,其本质上是利用open来操作文件 # 注释1 ; 注释2 [section1] # 节点 k1 = v1 # 值 k2 ...
- ntp服务器同步时间详细配置
部署NTP服务器进行时间同步 NTP服务端:linl_S IP:10.0.0.15 NTP客户端:lin_C IP:10.0.0.16 NTP服务概述 1.原理 NTP(Network ...
- BZOJ_3672_ [Noi2014]购票_CDQ分治+斜率优化
BZOJ_3672_ [Noi2014]购票_CDQ分治+斜率优化 Description 今年夏天,NOI在SZ市迎来了她30周岁的生日.来自全国 n 个城市的OIer们都会从各地出发,到SZ市参 ...
- 【Lintcode】018.Subsets II
题目: Given a list of numbers that may has duplicate numbers, return all possible subsets Notice Each ...
- VijosP1250:分组背包
背景 Wind设计了很多机器人.但是它们都认为自己是最强的,于是,一场比赛开始了~ 描述 机器人们都想知道谁是最勇敢的,于是它们比赛搬运一些物品. 它们到了一个仓库,里面有n个物品,每个物品都有一个价 ...
- java线程基本原理
1.线程池简介: 多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力. 假设一个服务器完成一项任务所需时间为:T1 创 ...
- C#自定义控件 类似于Linechart
界面效果: 对外提供的属性设置 /// <summary> /// 背景色 /// </summary> public Color BackColor; /// <sum ...
- Autofac依赖注入框架使用
简介: Autofac是一款IOC框架,比较于其他的IOC框架,如Spring.NET,Unity,Castle等等所包含的,它很轻量级性能上非常高 控制反转和依赖注入: 控制反转 IOC(Inver ...
- Hibernate延迟加载与opensessioninviewFilter
转自:https://blog.csdn.net/skk_7/article/details/17917339 hibernate延迟加载: 一个person对应多个school,使用hibernat ...