使用Runnable实现异步处理REST服务示例
Posted 小志的博客
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Runnable实现异步处理REST服务示例相关的知识,希望对你有一定的参考价值。
一、同步处理和异步处理的理解
-
同步处理:一个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。
三、使用Runnable实现异步处理的代码示例
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<String> query(){
logger.info("主线程开始");
Callable<String> result = new Callable<String>(){
@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。
以上是关于使用Runnable实现异步处理REST服务示例的主要内容,如果未能解决你的问题,请参考以下文章
我的Android进阶之旅关于Android使用bindService()绑定服务,onServiceConnected()方法是异步回调的问题以及借鉴NotificationManager来优化(代
我的Android进阶之旅关于Android使用bindService()绑定服务,onServiceConnected()方法是异步回调的问题以及借鉴NotificationManager来优化(代