當前位置:
首頁 >
前端技术
> javascript
>内容正文
javascript
Spring Boot项目开启异步使用多线程完整代码案例
生活随笔
收集整理的這篇文章主要介紹了
Spring Boot项目开启异步使用多线程完整代码案例
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
本文通過代碼來演示如果在spring boot的項目中使用多線程,也就是異步。要異步并不難,我們寫的代碼天天都在跟異步多線程打交道,容易讓人感到迷惑的是異步的底層原理,不僅要會使用,更要熟悉其實現原理,才能更加靈活地在項目中進行運用。
首先在pom.xml中引入依賴。
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.zhangxueliang.demo</groupId><artifactId>springbootdemo</artifactId><version>0.0.1-SNAPSHOT</version><packaging>jar</packaging><name>springbootdemo</name><description>Demo project for Spring Boot</description><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.1.0.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>fluent-hc</artifactId><version>4.5.3</version></dependency><dependency><!-- jsoup HTML parser library @ https://jsoup.org/ --><groupId>org.jsoup</groupId><artifactId>jsoup</artifactId><version>1.10.3</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.31</version></dependency><!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-jdbc --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><!--mysql驅動--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.12</version><scope>runtime</scope></dependency><!--集成mybatis--><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>1.3.1</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><!--整合freemarker--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-freemarker</artifactId></dependency><!--整合thymleaf--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><!--整合alibaba easyPOI--><dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-base</artifactId><version>3.2.0</version></dependency><dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-web</artifactId><version>3.2.0</version></dependency><dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-annotation</artifactId><version>3.2.0</version></dependency><!-- lombok可使代碼更簡潔 --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><scope>provided</scope></dependency><!--熱部署--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><optional>true</optional></dependency><!--引入AOP依賴--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency><!--整合MongoDB--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId></dependency><!--整合rabbitmq--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId></dependency><!--使用@Slf4j注解--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><!--爬蟲相關依賴--><!-- jsoup HTML parser library @ https://jsoup.org/ --><dependency><groupId>org.jsoup</groupId><artifactId>jsoup</artifactId><version>1.11.2</version></dependency><!--整合POI--><!--<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>RELEASE</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>RELEASE</version></dependency>--><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.15</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml-schemas</artifactId><version>3.15</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.15</version></dependency><!-- webMagic start --><dependency><groupId>us.codecraft</groupId><artifactId>webmagic-core</artifactId><version>0.7.3</version></dependency><dependency><groupId>us.codecraft</groupId><artifactId>webmagic-extension</artifactId><version>0.7.3</version></dependency><dependency><groupId>us.codecraft</groupId><artifactId>webmagic-extension</artifactId><version>0.7.3</version><exclusions><exclusion><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId></exclusion></exclusions></dependency><!-- webMagic end --><!--引入log工程jar--><!--<dependency><groupId>com.fengyuncx.log</groupId><artifactId>fy-log</artifactId><version>0.0.1-SNAPSHOT</version><scope>system</scope><systemPath>${project.basedir}/src/main/resources/lib/fy-log-0.0.1-SNAPSHOT.jar</systemPath></dependency>--></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><!--打包時將引入的本地jar打進去--><configuration><includeSystemScope>true</includeSystemScope></configuration></plugin></plugins></build></project>在啟動類上添加@EnableAsync注解,開啟異步.注意:如果在配置類上添加了該注解,啟動類上就無需添加。
@SpringBootApplication //@EnableAsync//開啟異步 public class ZxlDemoApplication {public static void main(String[] args) {SpringApplication.run(ZxlDemoApplication.class, args);}}編寫多線程配置類
/*** 線程配置類*/ @Configuration @EnableAsync public class AsyncTaskConfig implements AsyncConfigurer {// ThredPoolTaskExcutor的處理流程// 當池子大小小于corePoolSize,就新建線程,并處理請求// 當池子大小等于corePoolSize,把請求放入workQueue中,池子里的空閑線程就去workQueue中取任務并處理// 當workQueue放不下任務時,就新建線程入池,并處理請求,如果池子大小撐到了maximumPoolSize,就用RejectedExecutionHandler來做拒絕處理// 當池子的線程數大于corePoolSize時,多余的線程會等待keepAliveTime長時間,如果無請求可處理就自行銷毀@Overridepublic Executor getAsyncExecutor() {ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();taskExecutor.setCorePoolSize(50);// 核心線程數taskExecutor.setMaxPoolSize(50);// 最大線程數taskExecutor.setQueueCapacity(200);// 等待隊列taskExecutor.setThreadNamePrefix("zxl_taskExecutor-");//線程名稱前綴taskExecutor.initialize();return taskExecutor;}@Overridepublic AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {return null;} }編寫線程任務執行類
package com.zhangxueliang.demo.springbootdemo.async;import java.util.Random; import java.util.concurrent.Future;import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.scheduling.annotation.Async; import org.springframework.scheduling.annotation.AsyncResult; import org.springframework.stereotype.Service;/*** 線程執行任務類*/ @Service public class AsyncTaskService {private Logger logger = LoggerFactory.getLogger(AsyncTaskService.class);Random random = new Random();// 默認構造方法@Async// 表明是異步方法// 無返回值public void executeAsyncTask(String msg) {System.out.println(Thread.currentThread().getName()+"開啟新線程執行" + msg);}@Asyncpublic Future<String> doReturn(int i){logger.info(">>>>>>>>>>>>>>線程名>>>>>>>>>>>>>>"+Thread.currentThread().getName());try {// 這個方法需要調用500毫秒Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}// 消息匯總return new AsyncResult<>(String.format("這個是第{%s}個異步調用的證書", i));}/*** 異常調用返回Future* @return* @throws InterruptedException*/@Asyncpublic Future<Long> asyncInvokeReturnFuture() throws InterruptedException {long start = System.currentTimeMillis();Thread.sleep(5000);Future<Long> future = new AsyncResult<Long>((System.currentTimeMillis()-start));// Future接收返回值,這里是String類型,可以指明其他類型return future;}@Asyncpublic Future<Long> asyncInvokeReturnFuture2() throws InterruptedException {long start = System.currentTimeMillis();Thread.sleep(3500);Future<Long> future = new AsyncResult<Long>((System.currentTimeMillis()-start));// Future接收返回值,這里是String類型,可以指明其他類型return future;}@Asyncpublic Future<Long> asyncInvokeReturnFuture3() throws InterruptedException {long start = System.currentTimeMillis();Thread.sleep(2500);Future<Long> future = new AsyncResult<Long>((System.currentTimeMillis()-start));// Future接收返回值,這里是String類型,可以指明其他類型return future;} }編寫測試類,也就是調用多線程任務。
@RunWith(SpringRunner.class) @SpringBootTest public class ZxlTest {private Logger logger = LoggerFactory.getLogger(ZxlTest.class);@Autowiredprivate AsyncTaskService asyncTaskService;@Testpublic void testAsync(){ // String msg="測試測試"; // System.out.println(Thread.currentThread().getName()+":"+msg); // asyncTaskService.executeAsyncTask(msg);try {long start = System.currentTimeMillis();Future<Long> future = asyncTaskService.asyncInvokeReturnFuture();Future<Long> future2 = asyncTaskService.asyncInvokeReturnFuture2();Future<Long> future3 = asyncTaskService.asyncInvokeReturnFuture3();Long l1 = future.get();//5000Long l2 = future2.get();//3500Long l3 = future3.get();//2500System.out.println(Thread.currentThread().getName()+"*************************************");System.out.println(Thread.currentThread().getName()+(l1+l2+l3 ));System.out.println(Thread.currentThread().getName()+"-------------------------------------");System.out.println(Thread.currentThread().getName()+(System.currentTimeMillis()-start));System.out.println(Thread.currentThread().getName()+"+++++++++++++++++++++++++++++++++++++");} catch (Exception e) {e.printStackTrace();}} }總結
以上是生活随笔為你收集整理的Spring Boot项目开启异步使用多线程完整代码案例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java包装类API详解
- 下一篇: SpringMVC一个Controlle