多线程原因:
导致高并发情况下接口性能下降。
难点:
高并发下的异步线程记录
SpringUtils 研究下
线程池:主业务记个日志,异步需要给系统有个间隔切换,一般10ms。
线程池全局只能有1个,类似一个大别墅,只有一个池
线程池参数如何设置?不能写死!!!
高大上:分布式配置中心+动态线程池
标准:yml文件读取线程池配置【写个类封装 专门读取配置】 跟主业务无关的 按面向对象思想封装OOP
不要用超过5个@Value来获取值 应该单独读到配置类里使用更合适
yaml配置
thread:
pool:
core-pool-size: 5
# 默认是5个人记录 如果是高并发的话直接把下面两个放大到1000和5000 如果1秒来了1w个
# 我有1000个人来记录 性能就上来了
max-pool-size: 10
queue-capacity: 50
keep-alive-seconds: 60
@Confighration
@ConfigurationProperties(prefix = "thread.pool")【yaml配置里的前缀】
public class ThreadPoolProperties{
// 核心线程池大小
private int corePoolSize;
// 最大可创建线程数
private int maxPoolSize;
// 队列最大长度
private int queueCapacity;
// 线程池维护线程所允许的空闲时间
private int keepAliveSeconds;
}
前置知识
Timer定时器
当new一个Timer()的时候定时任务就启动了
这两个底层其实都是调用的new ScheduledThreadPoolExecutor();
里面要传Runnable或者Callable实例
这里Schedule方法只执行一次任务
scheduleAtFixedRate
scheduleAtFixedRate(RUnnable或Callable对象,添加定时任务多久后开始执行, 定时任务执行时间间隔,时间单位)周期执行定时任务
创建个3秒后执行的定时任务,执行间隔2秒
scheduleWithFixedDelay()
方法执行完以后,再隔多长时间执行下一次任务,和scheduleAtFixedRate()不同的是这个方法要执行完才会执行下一次,受方法执行时长影响。