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   执行结束
      
posted @ 2019-09-04 22:22  熠然  阅读(1500)  评论(0编辑  收藏  举报