目录

  • 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`线程池中,可以被其他异步任务复用。

线程池会根据配置的参数来管理线程的数量和复用,以提高异步任务的执行效率。