java 线程池学习小记
1. 为什么要是用线程池
- 反复创建线程开销大,用线程池可以让一部分线程一直处于运行状态,避免反复创建
- 过多的线程池会占用太多的内存,用线程池可以用少量的线程,避免了占用太多内存的问题
2. 使用线程池的好处
- 合理的使用cpu和内存资源
- 加快了响应速度,不需要反复的创建和消费
- 使用线程池,可以统一管理线程
3. 线程池的使用场合
- 服务器接收大量的请求,使用线程池是非常合适的
- 实际开发中,如果遇到需要创建线程太多的逻辑,
- 可以使用线程池
想要了解线程池,其创建线程池的参数是必须要了解,线程池类: ThreadPoolExecutor
ThreadPoolExecutor 类的构造方法
corePoolSize 核心线程数量 |
线程池在初始化完成以后,默认里面是没有线程的。在任务来的时候才会创建新的线程。当线程执行完成以后,线程池会保留 corePoolSize 数量的线程。 |
maximumPoolSize 最大的线程数量 |
当任务数量大于 corePoolSize 时候并且等待队列已满,还有当前线程数量没有超过 maximumPoolSize设置的数值,会再创建新的线程来执行任务,任务完成以后,只会保留核心数量的线程,其它的线程超过空闲时间就会销毁。 |
keepAliveTime 存活时长 |
存活时长 |
unit 存活时长的时间单位 |
存活时长的时间单位 |
workQueue 任务存储队列 |
1.直接交换:SynchronousQueue 该队列不能缓冲任务 2.无界队列:LinkedBlockingQueue该队列没有容量上限 3.有界队列:ArrayBlockingQueue 该队列有大小 |
threadFactory 线程工厂 |
线程工厂 创建新的线程时所用,有默认的线程工厂 |
handler 拒绝策略 |
拒绝策略 当线程池无法接受新任务时候的拒绝策略 |
workQueue 任务存储队列
- LinkedBlockingQueue 无界队列: 默认大小 int 最大值,因此可能会耗尽系统内存,引起OOM,非常危险。
- SynchronousQueue 直接交换队列 : 没有容量,不会保存,直接创建新的线程,因此需要设置很大的线程池数。否则容易执行拒绝策略,也很危险。
- ArrayBlockingQueue 有界队列:如果core满了,则存储在队列中,如果core满了且队列满了,则创建线程,直到maximumPoolSize 到了,如果队列满了且最大线程数已经到了,则执行拒绝策略。
handler 拒绝策略
- AbortPolicy :直接抛出异常,阻止系统正常工作.
- CallerRunsPolicy : 只要线程池未关闭,该策略直接在调用者线程中,运行当前被丢弃的任务。显然这样做不会真的丢弃任务,但是,任务提交线程的性能极有可能会急剧下降。
- DiscardOldestPolicy: 该策略将丢弃最老的一个请求,也就是即将被执行的一个任务,并尝试再次提交当前任务.
- DiscardPolicy: 该策略默默地丢弃无法处理的任务,不予任何处理,如果允许任务丢失,我觉得这是最好的方案.
实现 RejectedExecutionHandler 接口,并重写 rejectedExecution 方法可自定义拒绝策略
Executors工具类中提供了几种常用的线程池
// 创建单列线程的线程池ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();// 创建固定大小的线程池ExecutorService fixedThreadPool = Executors.newFixedThreadPool(4);// 创建带缓存的线程池ExecutorService cachedThreadPool = Executors.newCachedThreadPool();// 创建可以用时间调度的线程池ScheduledExecutorService scheduledService = Executors.newScheduledThreadPool(1);
1. 固定线程池
ExecutorService fixedThreadPool = Executors.newFixedThreadPool(5);
该方法返回一个固定线程数量的线程池。该线程池中的线程数量始终不变。当有一个新的任务提交时,线程池中若有空闲线程,则立即执行,若没有,则新的任务会被暂存在一个任务队列(默认无界队列 int 最大数)中,待有线程空闲时,便处理在任务队列中的任务。
2. 单例线程池
ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
该方法返回一个只有一个线程的线程池。若多余一个任务被提交到该线程池,任务会被保存在一个任务队列(默认无界队列 int 最大数)中,待线程空闲,按先入先出的顺序执行队列中的任务。
3. 缓存线程池
ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
该方法返回一个可根据实际情况调整线程数量的线程池,线程池的线程数量不确定,但若有空闲线程可以复用,则会优先使用可复用的线程,所有线程均在工作,如果有新的任务提交,则会创建新的线程处理任务。所有线程在当前任务执行完毕后,将返回线程池进行复用。
4. 任务调用线程池
ExecutorService scheduledService = Executors.newScheduledThreadPool(2);
该方法也返回一个 ScheduledThreadPoolExecutor 对象,该线程池可以指定线程数量。
java 线程池学习小记相关推荐
- Java线程池(1) - 问题驱动“Java线程池”学习
下面是几个Java线程池的问题,大家尝试回答一下: 1 使用线程池比手动创建线程好在哪里? 2 线程池的各个参数的含义? 3 线程池有哪 4 种拒绝策略? 4 有哪 6 种常见的线程池?什么是 Jav ...
- Java线程池 - 问题驱动学习
Java线程池 本章内容: 1.问题驱动"Java线程池"学习 2.线程池的功能需求 3.实现Thread Pool模式 4.JUC Executors源码分析
- JAVA线程池ThreadPoolExecutor与阻塞队列BlockingQueue .
2019独角兽企业重金招聘Python工程师标准>>> 从Java5开始,Java提供了自己的线程池.每次只执行指定数量的线程,java.util.concurrent.Thread ...
- 转:JAVA线程池ThreadPoolExecutor与阻塞队列BlockingQueue
从Java5开始,Java提供了自己的线程池.每次只执行指定数量的线程,java.util.concurrent.ThreadPoolExecutor 就是这样的线程池.以下是我的学习过程. 首先是构 ...
- java线程池使用详解ThreadPoolExecutor使用示例
一 使用线程池的好处 二 Executor 框架 2.1 简介 2.2 Executor 框架结构(主要由三大部分组成) 1) 任务(Runnable /Callable) 2) 任务的执行(Exec ...
- Java线程池详解学习:ThreadPoolExecutor
Java线程池详解学习:ThreadPoolExecutor Java的源码下载参考这篇文章:Java源码下载和阅读(JDK1.8) - zhangpeterx的博客 在源码的目录java/util/ ...
- Java 线程池详解学习:FixedThreadPool,CachedThreadPool,ScheduledThreadPool...
Java常用的线程池有FixedThreadPool和CachedThreadPool,我们可以通过查看他们的源码来进行学习. Java的源码下载参考这篇文章:Java源码下载和阅读(JDK1.8) ...
- 基于Java线程池读取数据库中数据(学习+运用)
基于Java线程池读取数据库中数据(学习+运用) 以下是学习内容 Main.java import java.util.concurrent.ArrayBlockingQueue; import ja ...
- 四种Java线程池用法解析
四种Java线程池用法解析 本文为大家分析四种Java线程池用法,供大家参考,具体内容如下 http://www.jb51.net/article/81843.htm 1.new Thread的弊端 ...
最新文章
- 科研文献|粪便污染可以解释人为影响环境中抗生素耐药基因丰度
- 用Java Instrumentation 在类加载时添加记录
- 关于YOLO算法的备忘
- sqlserve 热备用状态更新_核心交换机的链路聚合、冗余、堆叠、热备份
- 遍历一个数据去掉最后一个元素的样式
- 计算机显卡960,2015显卡开年之作!NVIDIA GTX960首测
- ORACLE获取某个时间段之间的月份列表和日期列表
- 版本代码详解:Alpha,Beta,Rc,GA,RTM,OEM等简称都代码什么意义
- 搜索最好的Android 代码
- Photoshop 2021安装教程附PS安装包下载
- 图像检索简介--笔记
- win10计算机网络共享设置密码,win10局域网设置密码如何设置_win10局域网怎么设置访问密码-win7之家...
- xingtai -斗罗大陆图片下载
- 字体加粗造成文字抖动
- android回收activity,Android系统回收activity行为
- Sentinel流控效果—Warm Up
- 简单工厂、工厂方法、抽象工厂、抽象工厂加简单工厂
- Java开发入门教程!java开发架构师职责
- Revit“原点”、“中心”、“测量点”在哪里?
- 坐标系统和投影变换基础知识及其在ArcGIS桌面产品中的应用(二)
热门文章
- java org.jb2011报错_Java中getResourceAsStream()用法总结(转)
- mysql商品管理系统总结_Mysql管理总结
- python遍历循环选择题_19道Python循环遍历,while,for语句测试题,网上看到的题目,自己不看答案全部做了一次,总共3个小时左右...
- 渝北统景碑口规划开发_渝北将又添“大水缸”御临河上将形成2.9平方公里人工湖面...
- C语言如何编写游戏界面,「分享」C语言如何编写图形界面
- 2011计算机考研分数线,2011年计算机考研各院校分数线 说明
- html主动发起重新布局,重启连不上网
- 计算机一级判断题2016,2016年12月计算机一级考试WPS判断题及答案
- java 读取url https_如何获取URL链接是http还是https
- 软件测试基础--笔记6