手写简单实现@Async异步方式

执行流程:

Aop

http请求

环绕通知开始

目标方法

环绕通知结束

代码如下:

1.自定义注解

package com.example.zmtestpj.config;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * @author zm
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MayiktAsync {

}

2.AOP环绕通知

package com.example.zmtestpj.config;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

@Aspect
@Component
public class ExtMayiktThreadAop {

    @Around(value = "@annotation(com.example.zmtestpj.config.MayiktAsync)")
    public void around(ProceedingJoinPoint joinPoint) {
        ExecutorService executorService = Executors.newCachedThreadPool();
        executorService.execute(() -> {
            try {
                joinPoint.proceed();
            } catch (Throwable throwable) {
                throwable.printStackTrace();
            }
        });
    }

}

3.service层

package com.example.zmtestpj.service;

import com.example.zmtestpj.config.MayiktAsync;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

/**
 * @author zm
 */
@Service
@Slf4j
public class OrderService {

    @MayiktAsync
    public void asyncLog() {
        try {
            Thread.sleep(3000);
            log.info("<2>");
        } catch (Exception e) {

        }
    }
}

4.web层

package com.example.zmtestpj.web;

import com.example.zmtestpj.service.OrderService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/zmAsyncWeb")
@Slf4j
public class zmAsyncWeb {
    @Autowired
    private OrderService orderService;

    //http://127.0.0.1:8083/zmtest/zmAsyncWeb/zmThreadAsync
    @RequestMapping(value = "/zmThreadAsync", method = RequestMethod.GET)
    public String zmThreadAsync(){
        log.info("<1>");
        orderService.asyncLog();
        log.info("<3>");
        log.info("<4>");
        return "ok";
    }
}

效果如下访问:

http://127.0.0.1:8083/zmtest/zmAsyncWeb/zmThreadAsync

日志打印的<2>单独开启了线程执行

 

async/await 是 JavaScript 中处理异步操作的一种语法糖,它使得异步代码的编写更加简洁和易读。下面是手写 async/await 的基本介绍: 1. async 函数:async 函数是一个返回 Promise 对象的函数。在函数内部,可以使用 await 关键字来等待一个 Promise 对象的状态变为 resolved(已完成)或 rejected(已拒绝),然后再继续执行后面的代码。 2. await 表达式:await 关键字只能在 async 函数内部使用。它可以暂停 async 函数的执行,等待一个 Promise 对象的状态变为 resolved,并返回 Promise 对象的结果值。如果 await 后面的表达式不是 Promise 对象,它会被自动转换为一个 resolved 的 Promise 对象。 下面是一个手写async/await 示例: ```javascript function delay(ms) { return new Promise(resolve => setTimeout(resolve, ms)); } async function fetchData() { try { console.log("Fetching data..."); await delay(2000); // 模拟异步操作 console.log("Data fetched!"); return "Data"; } catch (error) { console.error("Error:", error); throw error; } } async function main() { try { const data = await fetchData(); console.log("Received data:", data); } catch (error) { console.error("Error:", error); } } main(); ``` 在上面的示例中,fetchData 函数是一个异步函数,它使用了 await 关键字来等待 delay 函数返回的 Promise 对象。main 函数是程序的入口点,它使用了 async/await 来处理 fetchData 函数的返回值。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值