zoukankan      html  css  js  c++  java
  • Springboot 多线程

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

        @Configuration
        @EnableAsync
        public class TaskExecutorConfig {
        
            @Bean("taskExexutor")
            public Executor getAsyncExecutors(){
                ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
                executor.setCorePoolSize(5);
                executor.setQueueCapacity(25);
                executor.setMaxPoolSize(10);
                executor.initialize();
                return executor;
            }
        }
        
      • 任务执行类

        @Component
        public class TaskService {
            Logger logger = LoggerFactory.getLogger(TaskService.class);
        
            @Async("taskExexutor")
            public void doTask(int i) {
                String name = Thread.currentThread().getName();
                String content = String.format("发送短信方法---- %s", name);
                System.out.println("执行的顺序:" + i + " " + content + "   执行开始");
                for (int j = 0; j < 100000; j++) {
                    doSomething(j);
                }
                System.out.println(content + "   执行结束");
            }
        
            private void doSomething(int i) {
        //        try {
        ////            Thread.sleep(10);
        //        } catch (InterruptedException e) {
        //            e.printStackTrace();
        //        }
            }
        
            @Async("taskExexutor")
            public void doTask2() {
                String name = Thread.currentThread().getName();
                String content = String.format("发送短信方法---- %s", name);
                System.out.println(content + "   执行开始");
                for (int i = 0; i < 100000; i++) {
                    doSomething(i);
                }
                System.out.println(content + "   执行结束");
            }
        }
        
      • 运行

        @Component
        public class OrderTaskService {
        
            @Autowired
            private TaskService taskService;
        
            public void orderTask(int i)  {
                taskService.doTask(i);
        //        taskService.doTask2();
            }
        }
        
      • 测试类

        @RunWith(SpringRunner.class)
        @SpringBootTest(classes = Ch522Application.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
        public class TaskTest {
        
            @Autowired
            private OrderTaskService orderTaskService;
        
        
            @Test
            public void executorTest() {
                for (int i = 0; i < 15; i++) {
                    orderTaskService.orderTask(i);
                }
            }
        }
        
      • 测试结果

        执行的顺序:4 发送短信方法---- taskExexutor-5   执行开始
        执行的顺序:0 发送短信方法---- taskExexutor-1   执行开始
        执行的顺序:3 发送短信方法---- taskExexutor-4   执行开始
        执行的顺序:2 发送短信方法---- taskExexutor-3   执行开始
        执行的顺序:1 发送短信方法---- taskExexutor-2   执行开始
        发送短信方法---- taskExexutor-5   执行结束
        发送短信方法---- taskExexutor-1   执行结束
        执行的顺序:5 发送短信方法---- taskExexutor-5   执行开始
        发送短信方法---- taskExexutor-4   执行结束
        执行的顺序:7 发送短信方法---- taskExexutor-4   执行开始
        2019-09-04 22:19:49.710  INFO 13988 --- [       Thread-3] o.s.s.c.ThreadPoolTaskScheduler          : Shutting down ExecutorService 'taskScheduler'
        发送短信方法---- taskExexutor-3   执行结束
        发送短信方法---- taskExexutor-2   执行结束
        执行的顺序:9 发送短信方法---- taskExexutor-2   执行开始
        执行的顺序:6 发送短信方法---- taskExexutor-1   执行开始
        2019-09-04 22:19:49.718  INFO 13988 --- [       Thread-3] o.s.s.concurrent.ThreadPoolTaskExecutor  : Shutting down ExecutorService 'taskExexutor'
        发送短信方法---- taskExexutor-4   执行结束
        发送短信方法---- taskExexutor-5   执行结束
        执行的顺序:8 发送短信方法---- taskExexutor-3   执行开始
        发送短信方法---- taskExexutor-2   执行结束
        发送短信方法---- taskExexutor-3   执行结束
        发送短信方法---- taskExexutor-1   执行结束
        
  • 相关阅读:
    字节数组倒序
    Windows和Linux下apache-artemis-2.10.0安装配置
    delphi superobject解析复杂json
    delphi实现起泡提示效果
    启动delphi 2010 后无响应,过很久(几十秒后),出现错误框“displayNotification:堆栈溢出
    SVN更新失败,提示locked 怎么破
    jQuery学习之旅 Item10 ajax快餐
    jQuery学习之旅 Item9 动画效果
    jQuery学习之旅 Item8 DOM事件操作
    jQuery学习之旅 Item7 区别this和$(this)
  • 原文地址:https://www.cnblogs.com/liyiran/p/11461894.html
Copyright © 2011-2022 走看看