目录
一、同步处理和异步处理的理解
- 一、同步处理和异步处理的理解
- 二、同步处理的代码示例
- 三、使用Runnable实现异步处理的代码示例
-
同步处理:一个http请求进来,一个tomcat或者中间件会有一个相应的线程来处理http请求,所有的业务逻辑都会在此线程中执行,并会返回一个响应。
-
异步处理:一个http请求进来,一个tomcat或者中间件的主线程会调用一个副线程去执行业务逻辑,当副线程执行完以后,主线程再把结果返回。当副线程处理业务逻辑的过程中,主线程可以空闲出来处理其他请求。
1、代码
package com.xz.springsecuritydemo.async;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @description: 同步处理服务
* @author: xz
*/
@RestController
@RequestMapping("/syncOrder")
public class SyncController {
private Logger logger = LoggerFactory.getLogger(getClass());
//同步的方式执行
@GetMapping("/getOrder")
public String query(){
logger.info("主线程开始执行=======");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
logger.info("主线程执行结束--------");
return "success!";
}
}
2、模拟发送get请求,如下图:
3、查看控制台输出,如下图可知,都是同一个线程中执行,线程的名称都为nio-8001-exec-1。
1、代码
package com.xz.springsecuritydemo.async;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.concurrent.Callable;
/**
* @description: 通过Callable方式异步处理服务
* @author: xz
*/
@RestController
@RequestMapping("/asyncOrder")
public class AsyncController {
private Logger logger =LoggerFactory.getLogger(getClass());
//通过Callable方式实现异步的方式执行
@GetMapping("getOrder")
public Callable query(){
logger.info("主线程开始");
Callable result = new Callable(){
@Override
public String call() throws Exception {
logger.info("副线程开始=====");
Thread.sleep(2000);
logger.info("副线程结束-----");
return "success !";
}
};
logger.info("主线程结束");
return result;
}
}
2、模拟发送get请求,如下图:
3、查看控制台输出,如下图可知,主线程和副线程由不同的线程名称所执行,主线程的名称都为nio-8001-exec-4,副线程的名称为task-1。