java&springboot开发异步线程池写法和配置
在 Java 和 SpringBoot 中,异步和并发编程是两个重要的概念,用于提高应用程序的性能和响应能力。为了简化这些操作,提供了各种注解和类来帮助开发人员管理线程。
本博客文章将概述 Java 和 SpringBoot 中常用的异步/并发线程注解和使用类,并简要介绍它们各自使用的线程池。
1. @Async 注解
@Async
注解是 Spring 提供的用于声明异步方法的注解。当方法上添加此注解时,它将由 Spring 异步执行,这意味着它不会阻塞调用线程。
@Service
public class MyService {
@Async
public void asyncTask() {
// 此任务将异步执行
System.out.println("执行异步任务...");
}
}
使用的线程池:
@Async
注解默认使用 Spring 配置的 TaskExecutor
实例。如果未明确配置,则 Spring 将使用默认的 SimpleAsyncTaskExecutor
,它使用一个固定大小的线程池。
需要注意:@Async 注解默认在当前类的方法调用在当前类的@Async方法时,并不能开启异步,此时我们可以使用 applicationContext.getBean(beanName)获取下当前bean,调用下,即可开启异步。
2. @EnableAsync 注解
@EnableAsync
注解用于启用 Spring 对异步方法的支持。它通常在 Spring 配置类中使用,以确保 TaskExecutor
Bean 被创建并注册。
@Configuration
@EnableAsync
public class AppConfig {
@Bean
public TaskExecutor taskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(5);
executor.setMaxPoolSize(10);
executor.setQueueCapacity(200);
executor.setThreadNamePrefix("My-Task-");
return executor;
}
}
使用的线程池:
@EnableAsync
注解本身不会创建线程池。但是,它会触发 Spring 创建默认的 TaskExecutor
实例,如果未明确配置,则会使用 SimpleAsyncTaskExecutor
。
3. ExecutorService
接口
ExecutorService
接口是 Java 提供的用于管理线程池的标准接口。它提供了多种方法来创建和管理线程池,并提交要执行的任务。
ExecutorService executorService = Executors.newFixedThreadPool(5);
executorService.submit(() -> {
// 此任务将在由 executorService 管理的线程池中执行
System.out.println("执行任务...");
});
executorService.shutdown();
使用的线程池:
ExecutorService
接口本身不提供线程池。相反,它提供了用于创建和管理线程池的方法,例如 newFixedThreadPool
和 newCachedThreadPool
。
4. CompletableFuture
类
CompletableFuture
类是 Java 8 中引入的用于表示异步计算的未来结果的类。它提供了多种方法来组合和处理异步操作。
CompletableFuture<Void> future = CompletableFuture.supplyAsync(() -> {
// 此任务将异步执行
System.out.println("执行任务...");
return null;
});
future.thenAccept(result -> {
// 在任务完成后执行此操作
System.out.println("任务完成...");
});
使用的线程池:
CompletableFuture
类本身不提供线程池。但是,它提供了 supplyAsync
和 thenAcceptAsync
等方法,这些方法会自动将任务提交到默认的 ForkJoinPool
或自定义的 Executor
。
5. Spring @SpringBootApplication
注解
@SpringBootApplication
注解是 SpringBoot 提供的用于简化 Spring Boot 应用配置的注解。它包含了其他几个注解的功能,包括 @EnableAsync
,因此默认情况下会启用对异步方法的支持。
@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
使用的线程池:
@SpringBootApplication
注解会触发 Spring 创建默认的 TaskExecutor
实例,如果未明确配置,则会使用 SimpleAsyncTaskExecutor
。
总结
Java 和 SpringBoot 提供了多种注解和类来简化异步和并发编程。选择合适的工具取决于您的具体需求和应用程序的性能要求。
以下是一些额外的提示:
- 谨慎使用
@Async
注解,避免在调用线程上执行耗时操作。 - 使用
@EnableAsync
注解显式启用异步支持,并根据需要配置TaskExecutor
。 - 考虑使用
ExecutorService
或CompletableFuture
等更高级的工具,以获得更精细的线程
本文作者:Journey&Flower
本文链接:https://www.cnblogs.com/JourneyOfFlower/p/18091180
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
2021-03-23 Cron表达式周/星期/天时无效报错失败