Spring多线程处理

@Async 放在方法前,方法可以异步执行

@EnableAsync可以开启异步执行

配置类中,配置@Bean 返回Executor或ThreadPoolTaskScheduler,可以实现自定义的线程池,并实现对线程池的配置

@Configuration
@EnableAsync
public class config
{
    
    @Bean
    public Executor getExecutor()
    {
          ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();  
          executor.setCorePoolSize(5);  
          executor.setMaxPoolSize(10);  
          executor.setQueueCapacity(25);  
          executor.initialize();  
          return executor;  
    }
    
    @Bean
    public ThreadPoolTaskScheduler taskScheduler()
    {
        log.info("Setting up thread pool task scheduler with 20 threads.");
        ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
        scheduler.setPoolSize(20);
        scheduler.setThreadNamePrefix("task-");
        scheduler.setAwaitTerminationSeconds(60);
        scheduler.setWaitForTasksToCompleteOnShutdown(true);
        //异常处理方法
        //当用@Async注解的方法抛出异常的时候,可以使用该方法去处理异常
        scheduler.setErrorHandler(t -> schedulingLogger.error(
                "Unknown error occurred while executing task.", t
        ));
        //当线程池关闭的时候,如果再向线程池添加任务会抛出RejectedExecutionHandler异常
        //抛出的异常将会被该异常处理器接受
        scheduler.setRejectedExecutionHandler(
                (r, e) -> schedulingLogger.error(
                        "Execution of task {} was rejected for unknown reasons.", r
                )
        );
        return scheduler;
    }
}

以上两个Bean都可以实现对线程池的自定义。

也可以实现AsyncConffigurer接口实现对线程池更精细的粒度控制

@Component
public class MyAsyncConfigurer implements AsyncConfigurer{
     
     @Override
     public Executor getAsyncExecutor() {
            ......
     }
     
     //实现对运行中线程抛出的异常更精细的处理
    @Override
    public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
        return new AsyncUncaughtExceptionHandler() {
            @Override
            public void handleUncaughtException(Throwable ex, Method method, Object... params) {
                
            }
        }
    } 

    //自定义任务执行器:在定义了多个任务执行器的情况下,可以使用@Async("getMineAsync")来设定
    @Bean
    public Executor getMineAsync() {
    
    }
}

你可能感兴趣的:(Spring多线程处理)