代码:https://github.com/NIGHTFIGHTING/spring_boot_learning/tree/master/19-20/agan-boot/agan-boot-async
### 五、为什么要给@Async自定义线程池?
@Async注解,在默认情况下用的是SimpleAsyncTaskExecutor线程池,该线程池不是真正意义上的线程池,因为线程不重用,每次调用都会新建一条线程。
可以通过控制台日志输出查看,每次打印的线程名都是[task-1]、[task-2]、[task-3]、[task-4].....递增的。
@Async注解异步框架提供多种线程
SimpleAsyncTaskExecutor:不是真的线程池,这个类不重用线程,每次调用都会创建一个新的线程。
SyncTaskExecutor:这个类没有实现异步调用,只是一个同步操作。只适用于不需要多线程的地方
ConcurrentTaskExecutor:Executor的适配类,不推荐使用。如果ThreadPoolTaskExecutor不满足要求时,才用考虑使用这个类
ThreadPoolTaskScheduler:可以使用cron表达式
ThreadPoolTaskExecutor :最常使用,推荐。 其实质是对java.util.concurrent.ThreadPoolExecutor的包装### 六、为@Async实现一个自定义线程池
#### 步骤1:配置线程池
```
@Configuration
@EnableAsync
public class SyncConfiguration {@Bean(name = "scorePoolTaskExecutor")public ThreadPoolTaskExecutor getScorePoolTaskExecutor() {ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();//核心线程数taskExecutor.setCorePoolSize(10);//线程池维护线程的最大数量,只有在缓冲队列满了之后才会申请超过核心线程数的线程taskExecutor.setMaxPoolSize(100);//缓存队列taskExecutor.setQueueCapacity(50);//许的空闲时间,当超过了核心线程出之外的线程在空闲时间到达之后会被销毁taskExecutor.setKeepAliveSeconds(200);//异步方法内部线程名称taskExecutor.setThreadNamePrefix("score-");/*** 当线程池的任务缓存队列已满并且线程池中的线程数目达到maximumPoolSize,如果还有任务到来就会采取任务拒绝策略* 通常有以下四种策略:* ThreadPoolExecutor.AbortPolicy:丢弃任务并抛出RejectedExecutionException异常。* ThreadPoolExecutor.DiscardPolicy:也是丢弃任务,但是不抛出异常。* ThreadPoolExecutor.DiscardOldestPolicy:丢弃队列最前面的任务,然后重新尝试执行任务(重复此过程)* ThreadPoolExecutor.CallerRunsPolicy:重试添加当前的任务,自动重复调用 execute() 方法,直到成功*/taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());taskExecutor.initialize();return taskExecutor;}
}```#### 步骤2: 为@Async指定线程池名字
``` @Async("scorePoolTaskExecutor")public void addScore2(){//TODO 模拟睡5秒,用于赠送积分处理try {Thread.sleep(1000*5);log.info("--------------处理积分--------------------");} catch (InterruptedException e) {e.printStackTrace();}}
```### 七、课后练习
在现实的互联网项目开发中,针对高并发的请求,一般的做法是高并发接口单独线程池隔离处理。
假设现在2个高并发接口:
一个是修改用户信息接口,刷新用户redis缓存.
一个是下订单接口,发送app push信息.
请参考本课程内容,设计2个线程池,分别用于[刷新用户redis缓存]和[发送app push信息

访问:http://127.0.0.1:9091/sync2

异步方法内部线程名称被修改score-

20.案例实战:为@Async实现一个自定义线程池相关推荐

  1. @Async 异步任务自定义线程池的配置方法和 @Scheduled 定时任务自定义线程池的配置方式

    文章目录 一.定时和异步业务场景描述 二.定时调度任务的实现方式 三.定时调度任务的问题描述 四.定时调度多线程解决方案(方案一) 五.异步多线程程序实现方式 六.定时调度多线程解决方案(方案二) 一 ...

  2. JAVA 多线程 JAVA 如何开发一个自定义线程池

    1.多线程设计介绍 每一个线程的启动和结束都是比较消耗时间和占用资源的. 如果在系统中用到了很多的线程,大量的启动和结束动作会导致系统的性能变卡,响应变慢. 为了解决这个问题,引入线程池这种设计思想. ...

  3. Springboot之@Async异步指定自定义线程池使用

    开发中会碰到一些耗时较长或者不需要立即得到执行结果的逻辑,比如消息推送.商品同步等都可以使用异步方法,这时我们可以用到@Async.但是直接使用 @Async 会有风险,当我们没有指定线程池时,他会默 ...

  4. 一文搞懂Java自定义线程池参数

    背景: 线程是一个开发经常使用的东西,但是实际工作中很少有新建一个线程去执行任务,线程的创建和销毁都会耗费资源,我们一般都会用线程池来完成线程的创建和销毁. 多说一句 JDK自带的线程池不建议大家去使 ...

  5. 多线程与高并发(七):详解线程池 - 自定义线程池,JDK自带线程池,ForkJoin,源码解析等

    Executor 接口关系 Callable:类似于Runnable,但是可以有返回值 Future:存储将来执行的结果.Callable被执行完之后的结果,被封装到Future里面. Future ...

  6. 自定义java线程池_我的Java自定义线程池执行器

    自定义java线程池 ThreadPoolExecutor是Java并发api添加的一项功能,可以有效地维护和重用线程,因此我们的程序不必担心创建和销毁线程,也不必关注核心功能. 我创建了一个自定义线 ...

  7. 我的Java自定义线程池执行器

    ThreadPoolExecutor是Java并发api添加的一项功能,可以有效地维护和重用线程,因此我们的程序不必担心创建和销毁线程,而将精力放在核心功能上. 我创建了一个自定义线程池执行程序,以更 ...

  8. QT案例实战1 - 从零开始编写一个OCR工具软件 (3)创建项目

    一.创建项目 打开Qt Creator,点击Create Project. 可以看到项目类型有应用.应用for python.类库等等,这里选择第一个QT应用,然后第二个栏中选择QT Weidgets ...

  9. Spring Boot使用@Async实现异步调用:自定义线程池

    在之前的Spring Boot基础教程系列中,已经通过<Spring Boot中使用@Async实现异步调用>一文介绍过如何使用 @Async注解来实现异步调用了.但是,对于这些异步执行的 ...

最新文章

  1. markdown错误和问题
  2. 愿...统一沟通...易行天下!
  3. php自定义扩展函数,Laravel框架中扩展函数、扩展自定义类的方法
  4. java魂斗罗_java 魂斗罗
  5. asp.net定时执行任务-解决应用池回收问题----转载
  6. xp系统c 语言命令重定向,Xp命令解释程序cmd.exe概述
  7. asp.net本质论学习笔记第一章
  8. 进击的UI---------------- UITextFieldUIButton
  9. 使用 sequelize 在 node 环境下操作 Mysql
  10. SQL注入语句(详细)
  11. 数据统计分析(SPSS)【7】
  12. js拖拽(二)仿iGoogle自定义首页模块拖拽
  13. Tableau豆瓣电影数据项目实战练习3
  14. MongoDB + Spark: 完整的大数据解决方案
  15. RT-Thread Studio配置连接WIFI模块
  16. iphone safaric中将mp4保存到本地相册
  17. 最火的Android开源项目整理
  18. 【Java】JDK 7 HashMap 头插法在并发情况下的成环问题
  19. java csv 双引号_你知道csv中如何输出英文双引号吗-百度经验
  20. 在交通突发事件应急处置中如何更好发挥“情指行一体化”警务模式作用?

热门文章

  1. android --------学习流程图
  2. POJ 2239 匈牙利算法
  3. 51CTO下载中心资源上传协议
  4. 深信服单点登入代理服务取AD
  5. Linux 命令(135)—— gpasswd 命令
  6. DOS 常用命令大全
  7. building for production...Killed
  8. 2017 西安网络赛A Tree(树上静态查询,带权并查集,矩阵乘法压位,好题)
  9. django上课笔记6-MVC,MTV架构-中间件-初识Form组件
  10. NYOJ 58 步数最少 【BFS】