美文网首页
使用线程池更新阅读次数

使用线程池更新阅读次数

作者: 小名源治 | 来源:发表于2022-08-06 11:50 被阅读0次

每次阅读文章,文章的阅读次数都要+1。
1.为什么要使用线程池来更新阅读次数
查看文章的时候,我们要将文章的阅读数量+1,这个时候进行了一次更新操作,更新的时候会加写锁,阻塞其他的操作,那么整体查看文章的性能就会比较低,它必须等待新增加观看数量完成后才给前端返回文章详情。

2.解决办法:
利用线程池实现,将更新操作放入到线程池中执行,那么它就和主线程没有关系,也就不会互相影响速度了(这样前端看到的就是更新之前的阅读数量)

3.SpringBoot实现
3.1创建线程池

@Configuration  //添加为config
@EnableAsync //开启线程池
public class ThreadPoolConfig {
    @Bean("taskExecutor")
    public Executor asyncServiceExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        // 设置核心线程数
        executor.setCorePoolSize(5);
        // 设置最大线程数
        executor.setMaxPoolSize(20);
        //配置队列大小
        executor.setQueueCapacity(Integer.MAX_VALUE);
        // 设置线程活跃时间(秒)
        executor.setKeepAliveSeconds(60);
        // 设置默认线程名称
        executor.setThreadNamePrefix("我的博客项目线程池");
        // 等待所有任务结束后再关闭线程池
        executor.setWaitForTasksToCompleteOnShutdown(true);
        //执行初始化
        executor.initialize();
        return executor;
    }
}

3.2新建一个线程Service

@Component
@Slf4j
public class ThreadService {

    /**
     * 每次阅读文章,文章的阅读数量+1
     * 此操作在线程池中执行   不会影响原有的主线程速度
     * @param articleMapper
     * @param article
     */
    @Async("taskExecutor")  //利用此注解将当前方法放入到线程池中使用
    public void updateArticleViewCount(ArticleMapper articleMapper, Article article) {
        //修改文章的阅读数量  数量 +1
        Article articleCopy = new Article();
        articleCopy.setViewCounts(article.getViewCounts() + 1); //阅读数量+1
        QueryWrapper<Article> queryWrapper = new QueryWrapper<>();
        //设置修改条件
        queryWrapper.eq("id", article.getId());
        queryWrapper.eq("view_counts" ,article.getViewCounts() );  // 为了线程安全
        //修改
        articleMapper.update(articleCopy, queryWrapper);
    }
}

3.3利用自动装配新建线程,完成增加阅读量的操作

    @Autowired
    private ThreadService threadService;


  //利用线程池增加文章阅读数量
 threadService.updateArticleViewCount(articleMapper,article);

相关文章

  • 25. 并发终结之ThreadPoolExecutor

    线程池概述 线程池的好处: 线程可重用,线程是稀缺资源,使用线程池可减少创建和销毁线程的次数,每个工作线程都可以被...

  • JAVA架构师必须掌握的线程池原理详解一

    线程池的优点 1、线程是稀缺资源,使用线程池可以减少创建和销毁线程的次数,每个工作线程都可以重复使用。 2、可以根...

  • 线程池实现原理

    一 线程池优点 1、线程是稀缺资源,使用线程池可以减少创建和销毁线程的次数,重复利用提升使用效率。 2、因为重复利...

  • 面试系列之java多线程

    1.线程池的优点?a. 线程是稀缺资源,线程的创建和消费是很耗资源的,使用线程池可以减少线程创建和销毁的次数,使得...

  • Java线程池的使用

    线程类型: 固定线程 cached线程 定时线程 固定线程池使用 cache线程池使用 定时调度线程池使用

  • 线程通讯详解

    关于子线程能否更新UI的思考线程通讯详解线程池-多线程的高效使用姿势 上文我们说到了关于子线程中能否更新UI的问题...

  • Java线程池

    为什么使用线程池: 减少创建和销毁线程的次数。 可以根据系统的承受能力,调整线程池中的线程的数量。 Java里面线...

  • java----线程池

    什么是线程池 为什么要使用线程池 线程池的处理逻辑 如何使用线程池 如何合理配置线程池的大小 结语 什么是线程池 ...

  • spring 线程池和java线程池

    jdk线程池就是使用jdk线程工具类ThreadPoolExecutor 创建线程池spring线程池就是使用自己...

  • Spring @Async开启异步任务

    定义线程池 使用线程池

网友评论

      本文标题:使用线程池更新阅读次数

      本文链接:https://www.haomeiwen.com/subject/eqsvwrtx.html