Spring 多线程与异步编程

背景

Spring是通过任务执行器(TaskExecutor)来实现多线程和并发编程的,Spring使用ThreadPoolTaskExecutor可实现一个基于线程池的TaskExecutor,在实际开发中,现在的多线程都是异步非阻塞的,所以我们在配置类中需要加上@EnableAsync注解,开启对异步任务的支持,并通过在实际执行的Bean的方法中使用@Async注解来声明其是一个异步任务。

使用实例

配置类

@Configuration
@ComponentScan("com.example.demo.test.taskExecutor")
@EnableAsync// 开启对异步的支持
public class TaskExecutorConfig implements AsyncConfigurer {

    @Override
    public Executor getAsyncExecutor() {
        ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
        taskExecutor.setCorePoolSize(4);
        taskExecutor.setMaxPoolSize(20);
        taskExecutor.setQueueCapacity(30);
        taskExecutor.initialize();
        return taskExecutor;
    }

    @Override
    public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {

        return null;
    }
}

上面的配置类中: 加了@EnableAsync注解,表示开启对异步任务的支持。
但是对异步任务的支持需要基于线程池,所以实现了AsyncConfigurer接口,通过重写 getAsyncExecutor() 方法,获得一个Spring的ThreadPoolTaskExecutor线程池,为异步方法实现提供支持。

异步方法执行类

@Service
public class AsyncExecutorTaskService {

    @Async
    public void executeAsyncTask1(Integer i){
        System.out.println("task1: 执行异步任务: "+i);
    }

    @Async
    public void executeAsyncTask2(Integer i){
        System.out.println("task2: 执行异步任务: "+ i);
    }
}

通过 @Async 注解标识这是一个异步任务,这个注解也可以放在类上面,那么这个类的所有方法都是一步方法。

启动类

public class APP {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(TaskExecutorConfig.class);
        AsyncExecutorTaskService asyncTaskService = context.getBean(AsyncExecutorTaskService.class);
        for(int i =1 ;i<=20; i++){
            asyncTaskService.executeAsyncTask1(i);
            asyncTaskService.executeAsyncTask2(i);
        }
        context.close();
    }
}

运行结果:
这里写图片描述

你可能感兴趣的:(Spring)