您当前的位置: 首页 > 

小志的博客

暂无认证

  • 0浏览

    0关注

    1217博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

使用Runnable实现异步处理REST服务示例

小志的博客 发布时间:2021-09-13 21:21:34 ,浏览量:0

目录
    • 一、同步处理和异步处理的理解
    • 二、同步处理的代码示例
    • 三、使用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。

在这里插入图片描述

三、使用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 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。 在这里插入图片描述

关注
打赏
1661269038
查看更多评论
立即登录/注册

微信扫码登录

0.0399s