Java Spring引导异步

Java Spring引导异步,java,multithreading,spring-boot,asynchronous,microservices,Java,Multithreading,Spring Boot,Asynchronous,Microservices,我不确定Spring引导异步是如何工作的?我知道webserver有自己的线程池,每个请求都由池中的一个线程处理。现在,当我们使用spring boot实现异步web服务并配置10个线程时,这是否意味着线程中有线程?为了澄清这一点,web服务器将向线程分配一个请求。现在,当该线程开始执行并调用标记为@Asynch的服务/函数时,它可以创建多个线程来处理该请求。请告诉我我的理解是否正确。使用@Async将使其在单独的线程中执行,即调用方不会等待被调用方法的完成。 您可以配置使用的执行器 @Conf

我不确定Spring引导异步是如何工作的?我知道webserver有自己的线程池,每个请求都由池中的一个线程处理。现在,当我们使用spring boot实现异步web服务并配置10个线程时,这是否意味着线程中有线程?为了澄清这一点,web服务器将向线程分配一个请求。现在,当该线程开始执行并调用标记为@Asynch的服务/函数时,它可以创建多个线程来处理该请求。请告诉我我的理解是否正确。

使用@Async将使其在单独的线程中执行,即调用方不会等待被调用方法的完成。 您可以配置使用的执行器

@Configuration
@EnableAsync
public class SpringAsyncConfig {

    @Bean(name = "fooExecutor")
    public Executor fooExecutor() {
        return new ThreadPoolTaskExecutor();
    }
}

使用@Async(“fooExecutor”)

您可以进行如下配置,以控制更多线程,例如带有前缀的线程名称、池大小,。。。通过这种方式,您可以确保控制线程池

   @Configuration
    @EnableAsync
    public class AsyncConfiguration implements AsyncConfigurer {

        @Override
        public Executor getAsyncExecutor() {
            ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
            executor.setCorePoolSize(5);
            executor.setMaxPoolSize(10);
            executor.setQueueCapacity(5000);
            executor.setThreadNamePrefix("MyThread-");
            executor.setWaitForTasksToCompleteOnShutdown(true);
            executor.initialize();
            return executor;
        }

        @Override
        public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
            return new SimpleAsyncUncaughtExceptionHandler();
        }
    }
然后将@Async注释放在代码bean或要使其异步的方法上

有关此主题的更多信息,请参阅spring的调度文档


我希望这会对您有所帮助;)

它不是一根线在另一根线里面@Async将使请求在单独的线程中执行,并且请求的调用方不会等待被调用的方法完成

要启用异步,可以通过添加

@Configuration
@EnableAsync
public class AsyncExample {
   // Define a threadpool executor if needed,
   @Bean(name = "threadPoolTaskExecutor")
   public Executor threadPoolTaskExecutor() {
      return new ThreadPoolTaskExecutor();
   }
}
然后,您可以使用定义的线程池执行器定义异步方法,如下所示

@Async("threadPoolTaskExecutor")
public void asyncMethodWithConfiguredExecutor() {
   // Method Definition
}

这是否意味着作为@Asynch的一部分创建的线程池将不同于web服务器线程池?