SpringBoot自定义线程池

一、SpringBoot自定义线程池最多多少

线程池的大小是由应用程序负责创建的任务决定的。用不太科学的方法来设置线程池的大小,可能会导致应用程序出现各种问题和运行瓶颈。在Springboot中,线程池的大小可能会影响应用程序的吞吐量和可伸缩性。

在Thread类中,在构造函数中提供了一个参数,可以指定线程池最大线程数。该变量名是MAX_THREADS。在Springboot中,我们可以在配置文件中通过设置spring.task.execution.pool.max-threads属性来设置线程池的大小。

@Configuration
@EnableAsync
public class AsyncConfig implements AsyncConfigurer {

  @Override
  public Executor getAsyncExecutor() {
    ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
    executor.setCorePoolSize(2);
    executor.setMaxPoolSize(100);
    executor.setQueueCapacity(5);
    executor.setThreadNamePrefix("CustomThreadpoolDemo");
    executor.initialize();
    return executor;
  }
}

二、SpringBoot自定义线程池异常

当线程池出现异常或线程池中的任务执行出现异常时,我们可以使用异常处理程序捕获和处理异常。

Springboot内置了一个线程池异常处理程序,在发生未捕获异常时,将自动使用该处理程序。可以为ThreadPoolTaskExecutor指定一个AsyncUncaughtExceptionHandler,以便在发生异常时向处理程序发送信息。

@Configuration
@EnableAsync
public class AsyncConfigWithExceptionHandler implements AsyncConfigurer {

  @Override
  public Executor getAsyncExecutor() {
    ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
    executor.setCorePoolSize(2);
    executor.setMaxPoolSize(100);
    executor.setQueueCapacity(5);
    executor.setThreadNamePrefix("CustomThreadpoolDemo");
    executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
    executor.initialize();
    return executor;
  }

  @Override
  public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
    return new CustomAsyncExceptionHandler();
  }
 
  private static class CustomAsyncExceptionHandler implements AsyncUncaughtExceptionHandler {
    @Override
    public void handleUncaughtException(Throwable ex, Method method, Object... params) {
      log.error("Exception message - " + ex.getMessage());
      log.error("Method name - " + method.getName());
      for (Object param : params) {
        log.error("Parameter value - " + param);
      }
    }
  }
}

三、SpringBoot自定义线程池无效

在Springboot中,初学者可能会遇到线程池无效的问题。如果在应用程序中配置了线程池,则只有使用@Async注释的方法才可以在其中运行。设置了线程池时,Springboot会尝试在其中查询该注释的方法,并调用其中方法的副本。

在使用Springboot自定义线程池的方法上添加@Async注解,以使该方法在配置的线程池中运行。如果没有注入线程池,则可能会调用原始方法。

@Service
public class UserServiceImpl implements UserService{

  @Autowired
  private UserRepository userRepository;

  @Autowired
  private NumberService numberService;

  @Override
  @Async("customAsyncExecutor")
  public CompletableFuture findById(Long id) {
    User user = userRepository.findById(id).orElse(null);
    int randomNumber = numberService.generateRandomNumber();
    user.setRandomNumber(randomNumber);
    return CompletableFuture.completedFuture(user);
  }
}

四、SpringBoot自定义线程池异步执行

在Springboot中,异步执行非常常见,并且可以通过简单地使用@Async注解来实现。使用@Async注解的方法在后台线程池中运行,并立即返回,而不必等待方法返回。

@Service
public class NotificationServiceImpl implements NotificationService {

  @Async("emailSendPool")
  @Override
  public CompletableFuture sendEmailNotification(String email, String message) {
    log.info("Send email to " + email);
    //send email logic
    return CompletableFuture.completedFuture("Email sent successfully to " + email);
  }

  @Async("smsSendPool")
  @Override
  public CompletableFuture sendSmsNotification(String phoneNumber, String message) {
    log.info("Send sms to " + phoneNumber);
    //send sms logic
    return CompletableFuture.completedFuture("SMS sent successfully to " + phoneNumber);
  }
}

五、基于SpringBoot自定义线程池

基于Springboot自定义线程池可以帮助应用程序实现异步事件处理。除了使用@Async注解外,还可以使用Springboot的基于事件的编程模型来自定义异步操作。

@Component
public class CartEventListener {

  @Async("cartStateChangePool")
  @EventListener
  public void cartChangeListener(ShoppingCartStateChangedEvent event) {
    //perform cart state change logic
    log.info("Shopping Cart state changed: " + event.getShoppingCart().getState());
  }
}

六、@Async自定义线程池

Springboot的@Async注解可以使用自定义线程池来调用应用程序的异步方法。使用@Async时,如果未提供自定义执行器,则会使用默认线程池。

@Configuration
@EnableAsync
public class AsyncConfig {

  @Bean("customAsyncExecutor")
  public Executor customAsyncExecutor() {
    ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
    executor.setCorePoolSize(2);
    executor.setMaxPoolSize(100);
    executor.setQueueCapacity(5);
    executor.setThreadNamePrefix("CustomThreadpoolDemo");
    executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
    executor.initialize();
    return executor;
  }
}

七、CompleteFuture自定义线程池

使用CompleteFuture可以帮助我们编写更清晰,更简单且更易于扩展的代码,因为我们可以利用CompleteFuture的方法链将片段组合在一起。

@Service
public class OrderServiceImpl implements OrderService {

  @Autowired
  private UserService userService;

  @Autowired
  private ProductService productService;

  @Async("customAsyncExecutor")
  @Override
  public CompletableFuture placeOrder(Long userId, Long productId) {
    CompletableFuture userFuture = userService.findById(userId);
    CompletableFuture productFuture = productService.findById(productId);

    return userFuture.thenCombine(productFuture, (user, product) -> {
        Order order = new Order();
        order.setUser(user);
        order.setProduct(product);
        order.setOrderDate(LocalDateTime.now());
        return order;
    });
  }
}

八、自定义线程池7个参数

在Springboot中,使用ThreadPoolTaskExecutor可以自定义线程池。可以通过以下七个参数设置线程池:

1. corePoolSize:线程池的大小(默认情况下5)

2. maxPoolSize:线程池的最大大小(默认情况下10)

3. queueCapacity:队列大小(默认情况下100)

4. keepAliveTime:线程池的线程保持活动的时间(默认情况下60s)

5. threadNamePrefix:每个线程的名称前缀(默认情况下“thread”)

6. rejectedExecutionHandler:拒绝策略(默认情况下使用ThreadPoolExecutor.CallerRunsPolicy)

7. allowCoreThreadTimeout:是否允许核心线程在空闲时间超过keepAliveTime时被回收(默认情况下为false)

@Configuration
@EnableAsync
public class AsyncConfig {

  @Bean("customAsyncExecutor")
  public ThreadPoolTaskExecutor customAsyncExecutor() {
    ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
    executor.setCorePoolSize(2);
    executor.setMaxPoolSize(100);
    executor.setQueueCapacity(5);
    executor.setThreadNamePrefix("CustomThreadpoolDemo");
    executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
    executor.initialize();
    return executor;
  }
}

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/296190.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-12-27 12:58
下一篇 2024-12-27 12:58

相关推荐

  • 从ga角度解读springboot

    springboot作为目前广受欢迎的Java开发框架,其中的ga机制在整个开发过程中起着至关重要的作用。 一、ga是什么 ga即Group Artifacts的缩写,它是Mave…

    编程 2025-04-29
  • Python中自定义函数必须有return语句

    自定义函数是Python中最常见、最基本也是最重要的语句之一。在Python中,自定义函数必须有明确的返回值,即必须要有return语句。本篇文章将从以下几个方面对此进行详细阐述。…

    编程 2025-04-29
  • Python线程等待指南

    本文将从多个方面详细讲解Python线程等待的相关知识。 一、等待线程结束 在多线程编程中,经常需要等待线程执行完毕再进行下一步操作。可以使用join()方法实现等待线程执行完毕再…

    编程 2025-04-29
  • Python两个线程交替打印1到100

    这篇文章的主题是关于Python多线程的应用。我们将会通过实际的代码,学习如何使用Python两个线程交替打印1到100。 一、创建线程 在Python中,我们可以使用Thread…

    编程 2025-04-28
  • ROS线程发布消息异常解决方法

    针对ROS线程发布消息异常问题,我们可以从以下几个方面进行分析和解决。 一、检查ROS代码是否正确 首先,我们需要检查ROS代码是否正确。可能会出现的问题包括: 是否正确初始化RO…

    编程 2025-04-28
  • Python自定义列表

    本文将为大家介绍Python中自定义列表的方法和应用场景。对自定义列表进行详细的阐述,包括列表的基本操作、切片、列表推导式、列表的嵌套以及列表的排序,希望能够帮助大家更好地理解和应…

    编程 2025-04-27
  • Python线程池并发爬虫

    Python线程池并发爬虫是实现多线程爬取数据的常用技术之一,可以在一定程度上提高爬取效率和数据处理能力。本文将从多个方面对Python线程池并发爬虫做详细的阐述,包括线程池的实现…

    编程 2025-04-27
  • 如何添加Python自定义模块?

    Python是一种非常流行的脚本语言,因其易学易用和功能强大而备受欢迎。自定义模块是Python开发中经常使用的功能之一。本文将从多个方面为您介绍如何添加Python自定义模块。 …

    编程 2025-04-27
  • SpringBoot Get方式请求传参用法介绍

    本文将从以下多个方面对SpringBoot Get方式请求传参做详细的阐述,包括URL传参、路径传参、请求头传参、请求体传参等,帮助读者更加深入地了解Get请求方式下传参的相关知识…

    编程 2025-04-27
  • SpringBoot如何设置不输出Info日志

    本篇文章将带您了解如何在SpringBoot项目中关闭Info级别日志输出。 一、为什么要关闭Info日志 在开发中,我们经常会使用Log4j、Logback等框架来输出日志信息,…

    编程 2025-04-27

发表回复

登录后才能评论