- 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 执行结束
-