Java异步化处理--线程池

1.异步化是什么?

new Thread? yes

同步:一件事情做完,再做另外一件事情。(烧水后处理工作)
异步:不用等一件事做完,就可以做另外一件事情。等第一件事完成时,可以收到一个通知,通知你这件事做好
了,你可以再进行后续处理。(烧水的时候,水壶有一个蜂鸣器;烧水时人可以同时处理工作。水烧好后,人能听
到声音,就知道水烧好了)

2.为什么需要异步化?

问题场景:调用的服务处理能力有限,或者接口的处理(或返回)时长较长,就应该考虑异步化了

  1. 用户等待时间有点长(比如要等AI生成)
  2. 业务服务器可能会有很多请求在处理,导致系统资源紧张,严重时导致服务器宕机或者无法处理新的请求
  3. 调用的第三方服务(AI能力)的处理能力是有限的,严重时AI可能会对后台系统拒绝服务

3.业务流程分析

3.1标准异步化的业务流程
  1. 当用户要进行耗时很长的操作时,点击提交后,不需要在界面嗯等,而是把这个任务保存到数据库中记录下来
  2. 用户要执行新任务时:
    1. 任务提交成功:
      1. 如果程序还有多余的空闲线程,可以立刻去做这个任务
      2. 如果程序的线程都在繁忙,无法继续处理,那就放到等待队列里
    2. 任务提交失败:比如程序所有线程都在忙,任务队列满了
      1. 拒绝掉这个任务,再也不去执行
      2. 通过保存到数据库中的记录来看到提交失败的任务,并且在程序闲的时候,可以把任务从数据库中捞到程序里,再去执行
  3. 程序(线程)从任务队列中取出任务依次执行,每完成一件事情要修改一下的任务的状态
  4. 用户可以查询任务的执行状态,或者在任务执行成功或失败时能得到通知(发邮件、系统消息提示、短信),从而优化体验
  5. 如果要执行的任务非常复杂,包含很多环节,在每一个小任务完成时,要在程序(数据库中)记录一下任务的执行状态(进度)
3.2以我的系统进行业务流程分析

这里针对我正在做的一个系统进行分析,(这部分内容读者可选择性阅读)

  1. 用户点击智能分析页的提交按钮时,先把图表立刻保存到数据库中(作为一个任务)
  2. 用户可以在图表管理页面查看所有图表(已生成的、生成中的、生成失败)的信息和状态
  3. 用户可以修改生成失败的图表信息,点击重新生成

优化流程
image.png
问题:

4.抛出问题

  1. 任务队列的最大容量应该设置多少?
  2. 程序怎么从任务队列中取出任务去执行?这个任务队列的流程怎么实现?怎么保证程序最多同时执行多少个任务?

5.线程池的作用

线程池就可以解决上面的问题

为什么需要线程池:

  1. 线程的管理比较复杂(比如什么时候新增线程、什么时候减少空闲线程)
  2. 任务存取比较复杂(什么时候接受任务、什么时候拒绝任务、保证多线程不抢到同一个任务)

线程池的作用:轻松管理线程、协调任务的执行过程

6.线程池的工作机制&&线程池的创建

这部分请看我的另外一篇文章:线程池的创建&&工作机制

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值