日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

10.异步调用

發(fā)布時(shí)間:2024/3/24 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 10.异步调用 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1.異步調(diào)用簡介
異步調(diào)用是相對于同步調(diào)用而言的,同步調(diào)用是指程序按預(yù)定順序一步一步執(zhí)行,每一步必須等到上一步執(zhí)行完成之后才能執(zhí)行,而異步調(diào)用則無需等待上一步程序執(zhí)行完成即可執(zhí)行。在日常開發(fā)的項(xiàng)目中,當(dāng)訪問的接口較慢或者做耗時(shí)任務(wù)時(shí),避免程序一直卡在耗時(shí)任務(wù)上,使程序能夠并行執(zhí)行,可以使用多線程來并行處理,也可以使用SpringBoot提供的異步處理方式@Async來處理。

2.引入依賴
新建一個(gè)SpringBoot工程,并在pom.xml文件中添加需要的dependency。

<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId> </dependency> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>1.1.1</version> </dependency> <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.2</version><scope>provided</scope> </dependency>

3.添加配置
在application.properties文件中添加如下配置信息。

############################################################ # # MySQL配置 # ############################################################ ### 連接信息 spring.datasource.url = jdbc:mysql://localhost:3306/mydb ### 用戶名 spring.datasource.username = root ### 密碼 spring.datasource.password = admin123 ### 驅(qū)動(dòng) spring.datasource.driver-class-name = com.mysql.cj.jdbc.Driver############################################################ # # MyBatis配置 # ############################################################ ### po類存放目錄 mybatis.type-aliases-package = com.leichuangkj.async.dao.po ### mapper(.xml)資源文件存放路徑 mybatis.mapper-locations = classpath:mybatis/mapper/*.xmlspring.aop.proxy-target-class = true

4.dao層開發(fā)
首先在項(xiàng)目目錄“/src/main/java/com/leichuangkj/async”下新建“/dao/po”目錄,并在po目錄下新建User實(shí)體類,具體代碼如下。

@Data @NoArgsConstructor @AllArgsConstructor @ToString public class User {private Integer id;private String name;private String email; }

然后在dao目錄下新建mapper目錄,并在mapper目錄下新建UserMapper接口,具體代碼如下。

@Repository public interface UserMapper {List<User> findAll(); }

最后在resource目錄下新建“mybatis/mapper”目錄,并在mapper目錄下新建UserMapper.xml文件,具體代碼如下。

<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" > <mapper namespace="com.leichuangkj.async.dao.mapper.UserMapper" ><resultMap id="BaseResultMap" type="com.leichuangkj.async.dao.po.User"><constructor><idArg column="id" javaType="java.lang.Integer" jdbcType="INTEGER" /><arg column="name" javaType="java.lang.String" jdbcType="VARCHAR" /><arg column="email" javaType="java.lang.String" jdbcType="VARCHAR" /></constructor></resultMap><select id="findAll" resultMap="BaseResultMap">select id, name, emailfrom user</select> </mapper>

5.service層開發(fā)
在項(xiàng)目目錄“/src/main/java/com/leichuangkj/async”下新建service目錄,并在service目錄下新建IUser接口,具體代碼如下。

public interface IUser {List<User> findAllSync() ;Future<List<User>> findAllAsync(); }

然后在service目錄下新建impl目錄,并在impl目錄下新建UserImpl實(shí)現(xiàn)類,具體代碼如下。

@Service public class UserImpl implements IUser {@AutowiredUserMapper userMapper;@Overridepublic List<User> findAllSync() {try {System.out.println("開始做任務(wù)");long start = System.currentTimeMillis();List<User> userList = userMapper.findAll();long end = System.currentTimeMillis();System.out.println("完成任務(wù),耗時(shí):" + (end - start)+"毫秒");return userList;}catch (Exception e){return Collections.emptyList();}}@Async@Overridepublic Future<List<User>> findAllAsync() {try {System.out.println("開始做任務(wù)");long start = System.currentTimeMillis();List<User> userList = userMapper.findAll();long end = System.currentTimeMillis();System.out.println("完成任務(wù),耗時(shí):" + (end - start)+"毫秒");return new AsyncResult<>(userList);}catch (Exception e){return new AsyncResult<>(null);}} }

6.controller層開發(fā)
在項(xiàng)目目錄“/src/main/java/com/leichuangkj/async”下新建controller目錄,并在controller目錄下新建UserController類,具體代碼如下。

@Controller @RequestMapping("/user") public class UserController {@AutowiredUserImpl userImpl;@RequestMapping(value = "/findAllSync",method = RequestMethod.GET)public void findAllSync(){long start = System.currentTimeMillis();System.out.println("第一次查詢所有用戶");List<User> userList1 = userImpl.findAllSync();System.out.println("第二次查詢所有用戶");List<User> userList2 = userImpl.findAllSync();System.out.println("第三次查詢所有用戶");List<User> userList3 = userImpl.findAllSync();long end = System.currentTimeMillis();System.out.println("總共消耗:"+ (end - start) + "毫秒");}@RequestMapping(value = "/findAllAsync",method = RequestMethod.GET)public void findAllAsync() throws InterruptedException {long start = System.currentTimeMillis();System.out.println("第一次查詢所有用戶");Future<List<User>> userList1 = userImpl.findAllAsync();System.out.println("第二次查詢所有用戶");Future<List<User>> userList2 = userImpl.findAllAsync();System.out.println("第三次查詢所有用戶");Future<List<User>> userList3 = userImpl.findAllAsync();while(true){if(userList1.isDone()&&userList2.isDone()&&userList3.isDone()){break;}else{Thread.sleep(10);}}long end = System.currentTimeMillis();System.out.println("總共消耗:"+ (end - start) + "毫秒");} }

7.啟動(dòng)項(xiàng)目
在啟動(dòng)類MyBatisApplication上添加注解“@MapperScan(basePackages = “com.leichuangkj.async.dao.mapper”)”和“@EnableAsync(proxyTargetClass = true)”,然后啟動(dòng)項(xiàng)目。

@MapperScan(basePackages = "com.leichuangkj.async.dao.mapper") @SpringBootApplication @EnableAsync(proxyTargetClass = true) public class AsyncApplication {public static void main(String[] args) {SpringApplication.run(AsyncApplication.class, args);} }

8.測試
啟動(dòng)項(xiàng)目,然后分別在postman中請求“http://localhost:8080/user/findAllSync”和“http://localhost:8080/user/findAllAsync”,可以在控制臺看到相應(yīng)的執(zhí)行結(jié)果,測試結(jié)果如下圖所示,可以看到同步執(zhí)行三次查詢耗時(shí)為988毫秒,異步執(zhí)行三次查詢耗時(shí)772毫秒,由此可見,異步調(diào)用速度比同步調(diào)用速度快。

9.工程目錄結(jié)構(gòu)

總結(jié)

以上是生活随笔為你收集整理的10.异步调用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。