10-SpringBoot——Spring 高级话题-多线程

xiaoxiao2021-02-28  67

Spring 高级话题-多线程

【博文目录>>>】


【项目源码>>>】


【多线程】


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

【代码实现】


package com.example.spring.framework.taskexecutor; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; /** * ①通过@Async 注解表明该方法是个异步方法,如果注解在类级别,则表明该类所有的 * 方法都是异步方法,而这里的方法自动被注入使用ThreadPoolTaskExecutor 作为TaskExecutor * Author: 王俊超 * Date: 2017-07-11 07:59 * All Rights Reserved !!! */ @Service public class AsyncTaskService { @Async public void executeAsyncTask(Integer i) { System.out.println("执行异步任务: " + i); } @Async public void executeAsyncTaskPlus(Integer i) { System.out.println("执行异步任务+1: " + (i + 1)); } } package com.example.spring.framework.taskexecutor; import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler; import org.springframework.aop.interceptor.SimpleAsyncUncaughtExceptionHandler; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.AsyncConfigurer; import org.springframework.scheduling.annotation.EnableAsync; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import java.util.concurrent.Executor; /** * ①利用@EnableAsync 注解开启异步任务支持。 * ②配置类实现AsyncConfigurer 接口并重写getAsyncExecutor 方法,并返回一个 * ThreadPoolTaskExecutor ,这样我们就获得了一个基于线程池TaskExecutor。 * Author: 王俊超 * Date: 2017-07-11 07:57 * All Rights Reserved !!! */ @Configuration @ComponentScan("com.example.spring.framework.taskexecutor") @EnableAsync public class TaskExecutorConfig implements AsyncConfigurer { // 1 @Override public Executor getAsyncExecutor() { // 2 ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor(); taskExecutor.setCorePoolSize(5); taskExecutor.setMaxPoolSize(10); taskExecutor.setQueueCapacity(25); taskExecutor.initialize(); return taskExecutor; } @Override public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() { return new SimpleAsyncUncaughtExceptionHandler(); } } package com.example.spring.framework.taskexecutor; import org.springframework.context.annotation.AnnotationConfigApplicationContext; /** * Author: 王俊超 * Date: 2017-07-11 07:55 * All Rights Reserved !!! */ public class Main { public static void main(String[] args) { AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(TaskExecutorConfig.class); AsyncTaskService asyncTaskService = context.getBean(AsyncTaskService.class); for (int i = 0; i < 10; i++) { asyncTaskService.executeAsyncTask(i); asyncTaskService.executeAsyncTaskPlus(i); } context.close(); } }

【运行结果】

转载请注明原文地址: https://www.6miu.com/read-68920.html

最新回复(0)