当前位置 博文首页 > A_art_xiang的博客:spring框架如何调用异步方法?快进来学学吧

    A_art_xiang的博客:spring框架如何调用异步方法?快进来学学吧

    作者:[db:作者] 时间:2021-07-14 15:32

    ?

    定义一个配置类

    这里一个默认的线程池,一个起了自己名字的线程池。(可以配置多个线程池)

    import org.springframework.aop.interceptor.AsyncExecutionAspectSupport;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.core.task.TaskExecutor;
    import org.springframework.scheduling.annotation.EnableAsync;
    import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
    
    import java.util.concurrent.ThreadPoolExecutor;
    
    /**
     * 线程池配置、启用异步
     * 
     */
    @EnableAsync(proxyTargetClass = true)
    @Configuration
    public class AsycTaskExecutorConfig {
    
    	@Bean(name = AsyncExecutionAspectSupport.DEFAULT_TASK_EXECUTOR_BEAN_NAME)
    	public TaskExecutor taskExecutor() {
    		ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
    		//核心线程池大小
    		executor.setCorePoolSize(10);
    		//最大线程数
    		executor.setMaxPoolSize(20);
    		//队列容量
    		executor.setQueueCapacity(200);
    		//活跃时间
    		executor.setKeepAliveSeconds(60);
    		//线程名字前缀
    		executor.setThreadNamePrefix("taskExecutor-");
    		executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
    		return executor;
    	}
    
    	@Bean(name = "testEx")
    	public TaskExecutor testEx() {
    		ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
    		// 设置核心线程数
    		executor.setCorePoolSize(5);
    		// 设置最大线程数
    		executor.setMaxPoolSize(10);
    		// 设置队列容量
    		executor.setQueueCapacity(20);
    		// 设置线程活跃时间(秒)
    		executor.setKeepAliveSeconds(60);
    		// 设置默认线程名称
    		executor.setThreadNamePrefix("test-");
    		// 设置拒绝策略
    		executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
    		// 等待所有任务结束后再关闭线程池
    		executor.setWaitForTasksToCompleteOnShutdown(true);
    		return executor;
    	}
    }

    使用一下看看吧

        @RequestMapping("/testAnys")
        public void testAnys(){
            System.out.println("testAnys");
            testAnysMethod();
            System.out.println("1");
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("2");
            testAnysMethod2();
            System.out.println("3");
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
    
        }
    
        @Async//这个使用默认的线程池
        public void testAnysMethod(){
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("async");
        }
        @Async("testEx")//这个使用自己命名的线程池
        public void testAnysMethod2(){
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("testEx");
        }

    运行

    testAnys
    async
    1
    2
    testEx
    3

    cs