线程池的使用和底层实现
来源:互联网 发布:宋朝士大夫 知乎 编辑:程序博客网 时间:2024/06/06 13:22
今天给大家带来的是线程池的学习和使用,同时记录并分享对这个技术点的运用。
什么是线程池
线程池是一种多线程处理的形式,通过把处理的任务添加到队列中,然后在创建线程后自动执行这些任务。线程池可以同时执行多个任务,如果任务队列已经满了,则新来的任务就会排队等待,线程池线程的数量永远不会大于既定最大值。
线程池的优点
- 线程池的重用使得我们不用为重复创建线程和销毁线程带来的性能开销而头疼。
- 线程池对线程数量是可控的,这就有效控制了大量线程之间相互抢夺资源造成的系统资源堵塞。
- 线程池对线程的有效管理,提高线程的利用率和让线程拥有一些简单的功能。
- 线程池能出色完成工作量大,时间短的任务。
线程池的参数
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue workQueue) {
this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
Executors.defaultThreadFactory(), defaultHandler);
}
corePoolSize:核心线程数
maximumPoolSize:最大线程数
keepAliveTime:非核心线程闲置时的超时时长,超过这个时长会被回收,如果核心线程.allowCoreThreadTimeOut设置成了true,那么核心线程在闲置的情况下,也会被回收
unit:超时的时间单位
workQueue:线程池中的任务队列,通过execute方法提交的runnable对象会存储在该队列中
从上面的参数就可以看出,线程池使用起来并不难,常用的参数也是这么几种,基本上掌握常用的参数能够满足大多数工作了。也可以根据自己项目的实际需求,对线程池进行个性化的定制,下面说说系统常用的4种线程池的实现原理。
1.newFixedThreadPool()
固定线程数量的线程池,线程处于空闲时也不会被回收。这种线程池里只含有核心线程,也就意味着不会被系统回收,同时只要一有任务,newfixedthreadpool就会更加快速的去响应。
2.newCachedThreadPool()
没有核心线程,不固定线程的数量,超时时长60秒,超过后会被回收,所以它的特性在空闲时,没有线程几乎是不占用内存的,适用于多量耗时少的任务。
3.newScheduledThreadPool(int corePoolSize)
固定核心线程,主要用于定时任务或者周期性任务。
4.newSingleThreadExecutor()
把所有任务统一在一个核心线程中顺序执行。
以上4种都是通过Executors 下面对应类型的方法来创建。
- 线程池的使用和底层实现
- 线程池的使用与底层实现机制
- 线程池的底层实现和5种创建方式
- synchronized的使用和底层实现原理
- Executors工厂类创建线程池的底层实现
- 【问题解决】线程池的使用和实现
- 使用数组和底层容器实现栈
- Java并发核心基础——线程池使用及底层实现机制详解
- Java并发核心基础——线程池使用及底层实现机制详解
- Java底层自带的线程池
- HashSet的底层实现了解和使用方法
- ArrayList和LinkedList底层实现的区别
- HashMap和HashSet的底层实现
- STL的底层实现和优缺点
- HashMap的实现原理和底层数据结构
- HashMap的实现原理和底层数据结构
- HashMap的实现原理和底层数据结构
- 解析unordeded_map和unordeded_set的底层实现
- 学习笔记2
- Android基于XMPP协议之实现即时通讯的原理
- Java 泛型的类型擦除和桥方法
- ArrayList VS LinkedList
- Node.js +Swagger Editor + Swagger-UI 环境搭建
- 线程池的使用和底层实现
- Unity学习笔记
- 二叉树--判断一棵二叉树是否是平衡二叉树&&求一颗二叉树的镜像
- cartographer源码分析(14)-transform-transform.h
- android异常处理
- java——类的组成及其修饰符
- C++多个else的配对问题
- K-进制数 oj31
- 顺时针打印矩阵