目录
- 1 线程池配置
- 2 采用Spring 的异步方法去执行(无返回值)
- 3 @Async("asyncExecutor") 设置的方法执行完成之后,线程会去哪
1 线程池配置
@Configuration
@EnableAsync
public class AsyncConfig {
@Bean(name = "asyncExecutor")
public ThreadPoolTaskExecutor asyncExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(10); // 设置核心线程池大小
executor.setMaxPoolSize(50); // 设置最大线程池大小
executor.setQueueCapacity(100); // 设置队列容量
executor.setThreadNamePrefix("AsyncThread-"); // 设置线程名称前缀
executor.initialize();
return executor;
}
}
2 采用Spring 的异步方法去执行(无返回值)
在启动类或者配置类加上 @EnableAsync 注解.
package me.deweixu.aysncdemo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableAsync;
@EnableAsync
@SpringBootApplication
public class AysncDemoApplication {
public static void main(String[] args) {
SpringApplication.run(AysncDemoApplication.class, args);
}
}
先把longTimeMethod 封装到Spring的异步方法中,这个方法一定要写在Spring管理的类中,注意注解@Async
@Async注解可以用在方法上,也可以用在类上,用在类上,对类里面所有方法起作用
@Service
public class AsynchronousService{
@Async
public void springAsynchronousMethod(){
longTimeMethod();
}
}
其他类调用这个方法。这里注意,一定要其他的类,如果在同类中调用,是不生效的。具体原因,可以去学习一下Spring AOP的原理
@Autowired
private AsynchronousService asynchronousService;
public void useAsynchronousMethod(){
//我们需要执行的代码1
asynchronousService.springAsynchronousMethod();
//我们需要执行的代码2
}
3 @Async(“asyncExecutor”) 设置的方法执行完成之后,线程会去哪
当使用`@Async("asyncExecutor")`注解将方法标记为异步执行时,
Spring框架会将该方法的执行委托给`asyncExecutor`线程池中的一个线程来处理。
一旦方法执行完成,该线程会返回到线程池中,可以被其他异步任务复用。
具体来说,当调用被`@Async("asyncExecutor")`注解标记的方法时,
Spring会将方法的执行封装为一个`Runnable`或`Callable`任务,
并将其提交给`asyncExecutor`线程池。线程池会从线程池中获取一个空闲的线程来执行该任务。
一旦任务执行完成,线程会返回到线程池中等待下一个任务。
线程池的作用是管理和复用线程,它会根据配置的核心线程数、最大线程数、
队列容量等参数来动态调整线程的数量。如果当前线程池中的线程数量超过核心线程数,
并且有空闲线程可用,那么新的任务会被分配给空闲线程执行。
如果所有线程都在执行任务并且任务队列已满,
那么线程池会根据最大线程数来创建新的线程来处理任务。
总结起来,使用`@Async("asyncExecutor")`注解标记的方法在执行完成后,
线程会返回到`asyncExecutor`线程池中,可以被其他异步任务复用。
线程池会根据配置的参数来管理线程的数量和复用,以提高异步任务的执行效率。