2023年7月21日发(作者:)
基于springboot,⾃定义线程池提⾼定时任务执⾏效率基于springboot,⾃定义线程池提⾼定时任务执⾏效率在主类上开启@EnableScheduling和@EnableAsync以执⾏定时任务/** * mallAdminApplication * * @author lyc **/@EnableDubboConfiguration@SpringBootApplication(exclude = {, , })@EnableSwaggerAutoConfig@EnableSchedulingpublic class MallAdminApplication { public static void main(String[] args) { (, args); }}
配置线程池/** * 线程池配置 * * @author lyc **/@Configuration@Slf4jpublic class ThreadPoolConfig { @Bean public Executor asyncServiceExecutor() { ("start asyncServiceExecutor"); ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); //配置核⼼线程数 ePoolSize(5); //配置最⼤线程数 PoolSize(5); //配置队列⼤⼩ ueCapacity(99999); //配置线程池中的线程的名称前缀 eadNamePrefix("async-service-"); // rejection-policy:当pool已经达到max size的时候,如何处理新任务 // CALLER_RUNS:不在新线程中执⾏任务,⽽是有调⽤者所在的线程来执⾏ ectedExecutionHandler(new RunsPolicy()); //执⾏初始化 lize(); return executor; }}
以下模拟每隔⼀秒钟分别向两张表中插⼊数据,可⽤于向数据库中快速插⼊⼀些随机数据⽤于测试的需要/** * 定时任务,⽤于添加测试数据 * * @author lyc **/@Component@Slf4jpublic class ScheduledTaskConfig { @Reference private IPmsProductService pmsProductService; @Reference private IOmsOrderService omsOrderService; @Reference private IUmsMemberService umsMemberService; private Snowflake snowflake = wflake(1L, 1L); /** *使⽤⾃定义的线程池执⾏任务 **/ @Autowired @Qualifier("asyncServiceExecutor") private Executor executor; @Scheduled(cron = "*/1 * * * * ?") @Async("asyncServiceExecutor") public void scheduledInsertPmsProduct() { for (int i = 0; i < 100; i++) { nc(() -> { String randomUUID = UUID(); String name = "商品名称" + randomUUID; (">>>>>>>>>>>>>开始插⼊商品数据: {}", name); (new PmsProduct().setName(name) .setDescription("商品描述" + randomUUID) .setProductSn("no" + randomUUID)); }, executor); } } @Scheduled(cron = "*/1 * * * * ?") @Async("asyncServiceExecutor") public void scheduledInsertUmsMember() { for (int i = 0; i < 100; i++) { nc(() -> { String snowflakeStr = Str(); String name = "user" + snowflakeStr; String nickname = "昵称" + snowflakeStr; Random random = new Random(); (">>>>>>>>>>>>>开始插⼊⽤户数据: {}", name); (new UmsMember() .setNickname(nickname) .setUsername(name) .setPassword(snowflakeStr) .setGender(t(3))); }, executor); } }}线程池的任务执⾏机制任务调度是线程池的主要⼊⼝,当⽤户提交了⼀个任务,接下来这个任务将如何执⾏都是由这个阶段决定的。了解这部分就相当于了解了线程池的核⼼运⾏机制。⾸先,所有任务的调度都是由execute⽅法完成的,这部分完成的⼯作是:检查现在线程池的运⾏状态、运⾏线程数、运⾏策略,决定接下来执⾏的流程,是直接申请线程执⾏,或是缓冲到队列中执⾏,亦或是直接拒绝该任务。其执⾏过程如下:⾸先检测线程池运⾏状态,如果不是RUNNING,则直接拒绝,线程池要保证在RUNNING的状态下执⾏任务。如果workerCount < corePoolSize,则创建并启动⼀个线程来执⾏新提交的任务。如果workerCount >= corePoolSize,且线程池内的阻塞队列未满,则将任务添加到该阻塞队列中。如果workerCount >= corePoolSize && workerCount < maximumPoolSize,且线程池内的阻塞队列已满,则创建并启动⼀个线程来执⾏新提交的任务。如果workerCount >= maximumPoolSize,并且线程池内的阻塞队列已满, 则根据拒绝策略来处理该任务, 默认的处理⽅式是直接抛异常。
发布者:admin,转转请注明出处:http://www.yc00.com/web/1689929213a295163.html
评论列表(0条)