使用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服务示例的主要内容,如果未能解决你的问题,请参考以下文章

010 异步处理Rest服务

异步处理rest服务

使用多线程提高REST服务器性能

我的Android进阶之旅关于Android使用bindService()绑定服务,onServiceConnected()方法是异步回调的问题以及借鉴NotificationManager来优化(代

我的Android进阶之旅关于Android使用bindService()绑定服务,onServiceConnected()方法是异步回调的问题以及借鉴NotificationManager来优化(代

Android性能优化之使用线程池处理异步任务