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   执行结束
        
  • 相关阅读:
    C#_Assembly-Reflection_程序集与反射
    C#_event_事件
    C#_扩展方法
    C#_Delegate_泛型
    C#_正则表达式
    C#_序列化
    Unity_ClickToShow_FadeInAndOut
    RecordToday
    写作技巧
    高效休息法
  • 原文地址:https://www.cnblogs.com/liyiran/p/11461894.html
Copyright © 2011-2022 走看看