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   执行结束
        
  • 相关阅读:
    洛谷 1339 最短路
    洛谷 1330 封锁阳光大学 图论 二分图染色
    洛谷 1262 间谍网络 Tarjan 图论
    洛谷 1373 dp 小a和uim之大逃离 良心题解
    洛谷 1972 莫队
    洛谷 2158 数论 打表 欧拉函数
    洛谷 1414 数论 分解因数 水题
    蒟蒻的省选复习(不如说是noip普及组复习)————连载中
    关于筛法
    关于整数划分的几类问题
  • 原文地址:https://www.cnblogs.com/liyiran/p/11461894.html
Copyright © 2011-2022 走看看