• Java并发——线程池


    目录

    一:使用线程池有什么优点

    二:线程池的七个参数

    三:使用Executor工厂类

    四:Spring Boot自定义线程池


    一:使用线程池有什么优点

    1. 线程池中线程的使用率提升,减少对象的创建、销毁;
    2. 线程池可以控制线程数,有效的提升服务器的使用资源,避免由于资源不足而发生宕机等问题;

    二:线程池的七个参数

    1. maximumPoolSize:最大线程数目 (最大线程数目 = 核心线程数目 + 救急线程数目)
    2. corePoolSize:核心线程数(最多保留的线程数目)
    3. keepAliveTime:生存时间(针对救急线程)
    4. unit:时间单位(针对救急线程)
    5. ThreadFactory:线程工厂(给线程取名字)
    6. WorkQueue:阻塞队列
    7. handler:拒绝策略

    什么时候使用救急线程?

    核心线程数目用完后,阻塞队列满了之后


    三:使用Executor工厂类

    Executors是一个工厂类,采用工厂模式可以方便的创建各种类型Executor线程池(4种)

    1:单线程的线程池:newSingleThreadExecutor()

    Executors.newSingleThreadExecutor()

    特点:

    • 创建一个Executor,顺序执行一个任务队列,每次只能执行一个任务。
    • 如果线程任务执行失败,单线程线程池会新建一个线程继续下一个任务
    • 使用场景:希望多个任务排队执行

    2:固定大小线程池:newFixedThreadPool

    Executors.newFixedThreadPool(5);  //创建线程数目为5的线程池

    特点:

    • 核心线程数 = 最大线程数
    • 阻塞队列是无界的,可以让任意数量的任务

    3:带缓冲的线程池:newCachedThreadPool()

    Executors.newCachedThreadPool();

    特点:

    • 线程数目会随任务数目增加而增加,同时也会回收已经空闲的线程。
    • 核心线程数目为0,最大线程数为int的最大值,
    • 创建的全部是救急线程,生存时间为60S
    • 阻塞队列没有容量

    4:周期性执行的线程池:newScheduledThreadPool

    Executors.newScheduledThreadPool(5000);

    特点

    • 该线程池支持定时,以及周期性的任务执行,
    • 我们可以延迟任务的执行时间,也可以设置一个周期性的时间让任务重复执行。

    线程池常见方法

    1. submit:在主线程中接受线程池中线程返回的结果
    2. execute:执行线程池中任务
    3. invokeAny:将线程池中任务全部执行,返回最先执行完的任务,其他任务取消
    4. invokeAll:将线程池中任务全部执行
    5. shutdown:关闭线程池,不会接受新任务,但会将剩余任务执行完
    6. shutdownNow:立即关闭线程池,返回线程中任务

    四:Spring Boot自定义线程池

    • @Async注解:使用系统默认或者 自定义的线程池
    • @EnableAsync注解:开启异步线程支持
    1. @Configuration
    2. @EnableAsync //开启异步线程支持
    3. public class ThreadPoolConfig {
    4. @Bean("taskExecutor") //注入Bean容器,给线程池取名字
    5. public Executor asyncServiceExecutor() {
    6. ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
    7. //参数一:设置最大线程数
    8. executor.setMaxPoolSize(20);
    9. //参数二:设置核心线程数
    10. executor.setCorePoolSize(5);
    11. //参数三:配置阻塞队列大小
    12. executor.setQueueCapacity(Integer.MAX_VALUE);
    13. //参数四五:设置线程活跃时间(秒)
    14. executor.setKeepAliveSeconds(60);
    15. //参数六:设置默认线程名称
    16. executor.setThreadNamePrefix("小苏打博客项目");
    17. //等待所有任务结束后再关闭线程池
    18. executor.setWaitForTasksToCompleteOnShutdown(true);
    19. //执行初始化
    20. executor.initialize();
    21. return executor;
    22. }
    23. }

    配置线程池

    1. @Component
    2. public class ThreadService {
    3. /*
    4. updateArticleViewCount 的实现
    5. 期望此操作在线程池,不能影响主线程
    6. */
    7. @Async("taskExecutor") //指定使用 taskExecutor 线程池
    8. public void updateArticleViewCount(ArticleMapper articleMapper, Article article) {
    9. int viewCounts = article.getViewCounts();
    10. Article articleUpdate = new Article();
    11. articleUpdate.setViewCounts(viewCounts+1);
    12. LambdaQueryWrapper
      updateWrapper = new LambdaQueryWrapper<>();
    13. updateWrapper.eq(Article::getId,article.getId());
    14. updateWrapper.eq(Article::getViewCounts,viewCounts);
    15. articleMapper.update(articleUpdate,updateWrapper);
    16. }
    17. }

    使用线程池

  • 相关阅读:
    Pytorch intermediate(三) RNN分类
    STL 迭代器萃取
    癌症研究科学家涉嫌伪造图片,4篇论文被撤稿,老板全身而退
    Pytorch入门实战(5):基于nn.Transformer实现机器翻译(英译汉)
    【C++/STL】stack和queue(容器适配器、优先队列、双端队列)
    Java中的大小顶堆的实现方式
    arduino框架开发esp32,arduino框架的优势是什么?为什么要用这个框架
    AQS之排斥锁分析
    Spring注解@NonNull作用 Spring注解@Nullable作用 Spring NonNull 注解作用 Spring Nullable注解作用
    MyBatis-Plus
  • 原文地址:https://blog.csdn.net/m0_46628950/article/details/125901805