当前位置: 首页 > news >正文

线程池个人笔记总结

线程池的创建示例
@Override@Bean(name = "threadPool")public ThreadPoolTaskExecutor getAsyncExecutor() {ThreadPoolTaskExecutor threadPool = new ThreadPoolTaskExecutor();// 设置核心线程数threadPool.setCorePoolSize(10);// 设置最大线程数threadPool.setMaxPoolSize(20);// 线程池所使用的缓冲队列threadPool.setQueueCapacity(10000);// 等待任务在关机时完成--表明等待所有线程执行完threadPool.setWaitForTasksToCompleteOnShutdown(true);// 线程池关闭的等待时间(默认为0)threadPool.setAwaitTerminationSeconds(60*5);// 非核心线程空闲的存活时间threadPool.setKeepAliveSeconds(1);// 线程名称前缀threadPool.setThreadNamePrefix("newton-thread-");// 线程池拒绝策略threadPool.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());// 初始化线程threadPool.initialize();return threadPool;}
线程池参数解释
KeepAliveTime是什么,有什么用

我们设置的KeepAliveTime的时间是非核心线程空闲的存活时间,如果超过存活时间则会被销毁目的为了节省系统资源

拒绝策略的触发条件

当任务队列已满并且线程池中的线程数达到最大线程数时,新提交的任务就会触发拒绝策略

任务队列什么时候有数据

只有当线程池的使用线程数达到最大线程数时(包括核心和非核心线程数),此时新的任务才会进入任务队列等待执行

核心线程和非核心线程有什么区别

首先他们运行速度没有区别,行速度取决于CPU的调度和处理能力,以及任务本身的复杂性和计算量,他们区别主要在核心线程不会被销毁,除非线程池关闭,非核心线程是达到一定条件额外创建的,并且超过设置的存活时间会被销毁来回收系统资源。

线程池执行流程
  • 先判断核心线程是否满了,如果没满就创建核心线程执行任务
  • 如果核心线程满了,判断最大线程是否满了,如果没满,就创建非核心线程执行任务
  • 判断非核心线程是否超过存活时间,如果超过,就销毁这个线程
  • 如果线程池中的使用的线程数达到最大线程数,新的任务就会进入等待队列
  • 如果等待队列满了和线程池都满了,则调用拒绝策略
线程池拒绝策略
AbortPolicy(默认策略):

抛出RejectedExecutionException异常,表示拒绝执行新任务。

CallerRunsPolicy:

将任务返回给调用线程执行,如果线程池已关闭,则丢弃任务。

DiscardPolicy:

默默丢弃无法处理的任务,不给予任何处理。

DiscardOldestPolicy:

丢弃任务队列中等待时间最久的任务,然后将新任务加入队列。

自定义拒绝策略

一般需要实现RejectedExecutionHandler接口。以下是一个自定义的拒绝策略示例:

import java.util.concurrent.RejectedExecutionHandler;
import java.util.concurrent.ThreadPoolExecutor;public class CustomRejectedExecutionHandler implements RejectedExecutionHandler {@Overridepublic void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {// 自定义拒绝策略,例如记录日志或将任务加入队列等System.err.println("Task rejected. " + r.toString());}
}

然后可以在创建线程池时使用自定义拒绝策略:

ThreadPoolExecutor executor = new ThreadPoolExecutor(corePoolSize, maxPoolSize, keepAliveTime, TimeUnit.SECONDS,new ArrayBlockingQueue<>(queueCapacity), new CustomRejectedExecutionHandler());
线程池常用方法
shutdown

shutdown() 方法会优雅地关闭线程池,等待已提交的任务执行完成(可以设置最长等待时间),不再接受新任务。

shutdownNow

shutdownNow() 会先改状态为STOP不接收新的任务,并尝试取消正在执行的任务,立即关闭线程池 并返回未执行的任务列表

CountDownLatch

CountDownLatch是一种倒计时锁,允许一个或多个线程等待其他线程执行完毕才运行

// 创建countDownLatch 数量为线程数
CountDownLatch countDownLatch = new CountDownLatch(10);
for (int i = 1; i <= maxPage; i++) {executor.execute(() -> {try{// 开线程执行业务逻辑xxx}catch{} finally {// 执行完一个线程任务就在finally中进行减1countDownLatch.countDown();}});
}
// 等待所有子线程执行完毕前会一直阻塞
countDownLatch.await();
// 后续主线程任务
xxx
setDefaultUncaughtExceptionHandler

用于为所有新创建的线程设置默认的未捕获异常处理器

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 编程-设计模式 7:桥接模式
  • pandas赋值不成功
  • 职业教育物联网实验实训室建设应用案例
  • 入营测评题解
  • BeanFactory 和FactoryBean的区别
  • linux常用网络工具汇总二
  • Duilib 二
  • openfeign本地试用
  • 工厂模式 vs 策略模式:Java设计模式详细对比
  • 科学碳目标|科学碳倡议|SBTI认证|科学基础目标倡议
  • JSONB字段搜索走索引
  • 【人工智能】常用的人工智能框架、模型、使用方法、应用场景以及代码实例的概述
  • 嵌入式实时操作系统VxWorks面试题及参考答案(4万字长文)
  • 学习笔记第十九天
  • 网络编程先验知识1
  • angular2 简述
  • canvas绘制圆角头像
  • Docker 笔记(2):Dockerfile
  • JAVA并发编程--1.基础概念
  • JDK 6和JDK 7中的substring()方法
  • jquery cookie
  • js递归,无限分级树形折叠菜单
  • Shell编程
  • VUE es6技巧写法(持续更新中~~~)
  • 对超线程几个不同角度的解释
  • 给第三方使用接口的 URL 签名实现
  • 计算机在识别图像时“看到”了什么?
  • 聊聊springcloud的EurekaClientAutoConfiguration
  • 那些年我们用过的显示性能指标
  • 如何正确配置 Ubuntu 14.04 服务器?
  • 一、python与pycharm的安装
  • “十年磨一剑”--有赞的HBase平台实践和应用之路 ...
  • RDS-Mysql 物理备份恢复到本地数据库上
  • 继 XDL 之后,阿里妈妈开源大规模分布式图表征学习框架 Euler ...
  • ​linux启动进程的方式
  • (delphi11最新学习资料) Object Pascal 学习笔记---第14章泛型第2节(泛型类的类构造函数)
  • (HAL库版)freeRTOS移植STMF103
  • (NO.00004)iOS实现打砖块游戏(九):游戏中小球与反弹棒的碰撞
  • (纯JS)图片裁剪
  • (附源码)计算机毕业设计ssm电影分享网站
  • (附源码)计算机毕业设计ssm高校《大学语文》课程作业在线管理系统
  • (全部习题答案)研究生英语读写教程基础级教师用书PDF|| 研究生英语读写教程提高级教师用书PDF
  • (十)Flink Table API 和 SQL 基本概念
  • (一)插入排序
  • (转)Linux整合apache和tomcat构建Web服务器
  • *_zh_CN.properties 国际化资源文件 struts 防乱码等
  • .axf 转化 .bin文件 的方法
  • .NET Core 发展历程和版本迭代
  • .net core使用ef 6
  • .NET 快速重构概要1
  • .NET/C# 避免调试器不小心提前计算本应延迟计算的值
  • .NET_WebForm_layui控件使用及与webform联合使用
  • /bin、/sbin、/usr/bin、/usr/sbin
  • @RequestMapping处理请求异常
  • [ vulhub漏洞复现篇 ] Hadoop-yarn-RPC 未授权访问漏洞复现