spring boot 定义线程池多线程执行任务

一. 定义线程池

将线程池创建到application启动类中

@SpringBootApplication
@EnableScheduling   // 定时任务
public class AskApplication {
    private static final Logger logger = LoggerFactory.getLogger(AskApplication.class);
    public static void main(String[] args) {
        SpringApplication.run(AskApplication.class, args);
        logger.info("========================启动完毕========================");
    }

//    @Bean(initMethod = "init" , destroyMethod = "del")
//    public BeanService beanService() {
//        return new BeanService();
//    }

    @Bean
    public ThreadPoolExecutor threadPoolExecutor() {
        // 创建一个 队列
        LinkedBlockingQueue queue = new LinkedBlockingQueue<>(10);

        // 核心线程数 最大线程数  非核心线程存活时间  TimeUnit时间单位   Queue超过线程数存储到什么队列中
        ThreadPoolExecutor threadPoolExecutor =
                new ThreadPoolExecutor(50, 100, 3000L, TimeUnit.SECONDS, queue);

        // 设置线程工程,自定义一下
        threadPoolExecutor.setThreadFactory(new ThreadFactory() {
            @Override
            public Thread newThread(@NotNull Runnable r) {
                // ThreadFactory工厂 , 可以对 线程任务分发线程,进行一些特定行为:取名称..等
                return new Thread(r , "任务class名称:---" + r.getClass().getName());
            }
        });

        // 设置内存饱满处理机制
        // hreadPoolExecutor.AbortPolicy() 是一个内部类 , 所以这个new 是创建的 AbortPolicy 对象
        threadPoolExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy());

        // 创建线程池
        return threadPoolExecutor;
    }

}

二. 使用

  1. 定义线程池
@Autowired
private ThreadPoolExecutor threadPoolExecutor;
  1. 使用execute()调用线程
  threadPoolExecutor.execute(new InsertRunnable());
  1. 线程类实现Runable
public class InsertRunnable implements Runnable {
 // 线程中的对象需要手动从spring容器中获取
 private static final service类 对象名称 = (service类)AppBean.getBean(对象名称);
}
  1. 手动获取bean对象的工具类
public class AppBean implements ApplicationContextAware {

    private static ApplicationContext applicationContext;

    /**
     * @Override
     * @see org.springframework.context.ApplicationContextAware#setApplicationContext(org.springframework.context.ApplicationContext) <BR>
     * Method name: setApplicationContext <BR>
     * Description: please write your description <BR>
     * Remark: <BR>
     * @param
     * @throws BeansException  <BR>
     */
    @Override
    public void setApplicationContext(ApplicationContext appContext) throws BeansException {
        applicationContext = appContext;
    }

    public static ApplicationContext getApplicationContext() {
        return applicationContext;
    }

    public static Object getBean(String name){
        return applicationContext.getBean(name);
    }
    
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个使用 Spring Boot 中的 @Async 注解来实现多线程调用 RestTemplate 的示例代码: 首先,在启动类上添加 @EnableAsync 注解,启用异步处理: ```java @SpringBootApplication @EnableAsync public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ``` 接着,在配置类中创建 RestTemplate 的实例,并将其作为 Bean 注入到容器中: ```java @Configuration public class RestTemplateConfig { @Bean public RestTemplate restTemplate() { return new RestTemplate(); } } ``` 然后,在 Service 类中定义一个异步方法,使用 @Async 注解标记该方法为异步处理: ```java @Service public class UserService { @Autowired private RestTemplate restTemplate; @Async public CompletableFuture<User> getUserById(int id) { String url = "https://example.com/api/user/{id}"; User user = restTemplate.getForObject(url, User.class, id); return CompletableFuture.completedFuture(user); } } ``` 在该方法中,我们使用 RestTemplate 发送了一个 GET 请求,并将响应转换成了 User 对象。然后,我们使用 CompletableFuture.completedFuture 方法将 User 对象包装成 CompletableFuture 对象,并返回。 最后,在 Controller 类中调用 UserService 的异步方法: ```java @RestController public class UserController { @Autowired private UserService userService; @GetMapping("/user/{id}") public CompletableFuture<User> getUserById(@PathVariable int id) { return userService.getUserById(id); } } ``` 在该方法中,我们调用了 UserService 的 getUserById 方法,并返回了一个 CompletableFuture 对象。 需要注意的是,在使用 @Async 注解时,需要注意线程池的配置和异常处理。可以在配置类中通过配置 ThreadPoolTaskExecutor 来自定义线程池的大小和其他属性。在方法中,需要使用 try-catch 块来捕获异常,并进行适当的处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值