• 15点睛Spring4.1-TaskExecutor


    转发:https://www.iteye.com/blog/wiselyman-2212679

    15.1 TaskExecutor

    • spring的TaskExecutor为在spring环境下进行并发的多线程编程提供了支持;
    • 使用ThreadPoolTaskExecutor可实现一个基于线程池的TaskExecutor;
    • 使用@EnableAsync开启异步任务支持;
    • 使用@Async注解方法是异步方法;

    15.2 示例

    15.2.1 声明taskExecutor

    package com.wisely.task.executor;
    
    import java.util.concurrent.Executor;
    
    import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.scheduling.annotation.AsyncConfigurer;
    import org.springframework.scheduling.annotation.EnableAsync;
    import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
    
    @Configuration
    @EnableAsync
    public class DemoConfig implements AsyncConfigurer{
        public Executor getAsyncExecutor() {
            ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
            taskExecutor.setCorePoolSize(5);
            taskExecutor.setMaxPoolSize(10);
            taskExecutor.setQueueCapacity(25);
            taskExecutor.initialize();
            return taskExecutor;
        }
    
        public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
            return null;
        }
    
    }
    
    

    15.2.2 异步任务实现代码

    package com.wisely.task.executor;
    
    import org.springframework.scheduling.annotation.Async;
    import org.springframework.stereotype.Component;
    
    @Component
    public class DemoAsyncTask {
        @Async
        public void executeAsyncTask(Integer i){
            System.out.println("执行异步任务:"+i);
        }
    
        @Async
        public void executeAsyncTaskPlus(Integer i){
            System.out.println("执行异步任务+1:"+(i+1);
        }
    }
    

    15.2.3 测试

    package com.wisely.task.executor;
    
    import org.springframework.context.annotation.AnnotationConfigApplicationContext;
    
    public class Main {
    
        public static void main(String[] args) {
            AnnotationConfigApplicationContext context =
                    new AnnotationConfigApplicationContext("com.wisely.task.executor");
            DemoAsyncTask task = context.getBean(DemoAsyncTask.class);
            for(int i =0 ;i<10;i++){
                task.executeAsyncTask(i);
                task.executeAsyncTaskPlus(i);
            }
            context.close();
    
        }
    
    
    }
    
    

    输出结果(结果是并发执行而不是顺序执行的):

    执行异步任务+1:10
    执行异步任务:6
    执行异步任务:4
    执行异步任务+1:7
    执行异步任务:3
    执行异步任务:1
    执行异步任务:5
    执行异步任务:7
    执行异步任务+1:8
    执行异步任务:8
    执行异步任务+1:9
    执行异步任务:9
    执行异步任务+1:1
    执行异步任务:0
    执行异步任务+1:2
    执行异步任务+1:3
    执行异步任务:2
    执行异步任务+1:4
    执行异步任务+1:5
    执行异步任务+1:6
     
  • 相关阅读:
    Java网络编程注意事项3
    存储在图的形式——邻接矩阵(排列)
    C++ Primer 学习笔记_35_STL实践与分析(9)--map种类(在)
    [Django1.6]south于django1.6使用
    《Javascript权威指南》13号学习笔记:使用日期和时间
    POJ 1699 Best Sequence (DFS+预处理)
    第五蓝桥杯 蚂蚁冷
    Mac OS X 在捕捉AppLAN通信包
    面向对象、内存模型、动态绑定
    链接器与分离编译
  • 原文地址:https://www.cnblogs.com/Jeely/p/11949977.html
Copyright © 2020-2023  润新知