Java异步化处理--线程池
1.异步化是什么?
new Thread? yes
同步:一件事情做完,再做另外一件事情。(烧水后处理工作)
异步:不用等一件事做完,就可以做另外一件事情。等第一件事完成时,可以收到一个通知,通知你这件事做好
了,你可以再进行后续处理。(烧水的时候,水壶有一个蜂鸣器;烧水时人可以同时处理工作。水烧好后,人能听
到声音,就知道水烧好了)
2.为什么需要异步化?
问题场景:调用的服务处理能力有限,或者接口的处理(或返回)时长较长,就应该考虑异步化了
- 用户等待时间有点长(比如要等AI生成)
- 业务服务器可能会有很多请求在处理,导致系统资源紧张,严重时导致服务器宕机或者无法处理新的请求
- 调用的第三方服务(AI能力)的处理能力是有限的,严重时AI可能会对后台系统拒绝服务
3.业务流程分析
3.1标准异步化的业务流程
- 当用户要进行耗时很长的操作时,点击提交后,不需要在界面嗯等,而是把这个任务保存到数据库中记录下来
- 用户要执行新任务时:
- 任务提交成功:
- 如果程序还有多余的空闲线程,可以立刻去做这个任务
- 如果程序的线程都在繁忙,无法继续处理,那就放到等待队列里
- 任务提交失败:比如程序所有线程都在忙,任务队列满了
- 拒绝掉这个任务,再也不去执行
- 通过保存到数据库中的记录来看到提交失败的任务,并且在程序闲的时候,可以把任务从数据库中捞到程序里,再去执行
- 任务提交成功:
- 程序(线程)从任务队列中取出任务依次执行,每完成一件事情要修改一下的任务的状态
- 用户可以查询任务的执行状态,或者在任务执行成功或失败时能得到通知(发邮件、系统消息提示、短信),从而优化体验
- 如果要执行的任务非常复杂,包含很多环节,在每一个小任务完成时,要在程序(数据库中)记录一下任务的执行状态(进度)
3.2以我的系统进行业务流程分析
这里针对我正在做的一个系统进行分析,(这部分内容读者可选择性阅读)
- 用户点击智能分析页的提交按钮时,先把图表立刻保存到数据库中(作为一个任务)
- 用户可以在图表管理页面查看所有图表(已生成的、生成中的、生成失败)的信息和状态
- 用户可以修改生成失败的图表信息,点击重新生成
优化流程
问题:
4.抛出问题
- 任务队列的最大容量应该设置多少?
- 程序怎么从任务队列中取出任务去执行?这个任务队列的流程怎么实现?怎么保证程序最多同时执行多少个任务?
5.线程池的作用
线程池就可以解决上面的问题
为什么需要线程池:
- 线程的管理比较复杂(比如什么时候新增线程、什么时候减少空闲线程)
- 任务存取比较复杂(什么时候接受任务、什么时候拒绝任务、保证多线程不抢到同一个任务)
线程池的作用:轻松管理线程、协调任务的执行过程
6.线程池的工作机制&&线程池的创建
这部分请看我的另外一篇文章:线程池的创建&&工作机制