异步,同步的概念以及@Async的介绍

应用场景

1.同步

同步就是整个处理过程顺序执行,当各个过程都执行完毕,并返回结果。

2. 异步

异步调用则是只是发送了调用的指令,调用者无需等待被调用的方法完全执行完毕;而是继续执行下面的流程。例如, 在某个调用中,需要顺序调用 A, B, C三个过程方法;如他们都是同步调用,则需要将他们都顺序执行完毕之后,方算作过程执行完毕; 如B为一个异步的调用方法,则在执行完A之后,调用B,并不等待B完成,而是执行开始调用C,待C执行完毕之后,就意味着这个过程执行完毕了。在Java中,一般在处理类似的场景之时,都是基于创建独立的线程去完成相应的异步调用逻辑,通过主线程和不同的业务子线程之间的执行流程,从而在启动独立的线程之后,主线程继续执行而不会产生停滞等待的情况。

java处理异步

1.常规的异步调用处理方式

1.在Java中,一般在处理类似的场景之时,都是基于创建独立的线程去完成相应的异步调用逻辑,通过主线程和不同的线程之间的执行流程,从而在启动独立的线程之后,主线程继续执行而不会产生停滞等待的情况。
2.通过消息队列中间件去做异步,比如RabbitMq,去解耦。

2.@Async介绍

在Spring中,基于@Async标注的方法,称之为异步方法;这些方法将在执行的时候,将会在独立的线程中被执行,调用者无需等待它的完成,即可继续其他的操作。

无返回值使用

下面展示一些 代码示例

/**
     * 带参数的异步调用 异步方法可以传入参数
     *  对于返回值是void,异常会被AsyncUncaughtExceptionHandler处理掉
     * @param s
     */
    @Async
    public void asyncInvokeWithException(String s) {
        log.info("asyncInvokeWithParameter, parementer={}", s);
        throw new IllegalArgumentException(s);
    }

有返回值使用

1.不考虑过期时间

/**
     * // 失败回滚状态
     * @param result
     * @param id 单据主键id
     * @return java.util.concurrent.Future<java.lang.Boolean>
     */
    public void updateFailure(Future<Boolean> result, String id) {

        try {
        	//设置了超时时间,若超时会抛出TimeoutException 
            if(!result.get()) {
                // 失败回滚状态
                ......
                ......
                log.info("失败状态回滚 id: {}", id);
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
    }

2.处理返回值

  • 普通处理
/**
    * // 失败回滚状态
    * @param result
    * @param id 单据主键id
    * @return java.util.concurrent.Future<java.lang.Boolean>
    */
   public void updateFailure(Future<Boolean> result, String id) {

       try {
       	//设置了超时时间,若超时会抛出TimeoutException 
           if(!result.get()) {
               // 失败回滚状态
               ......
               ......
               log.info("失败状态回滚 id: {}", id);
           }
       } catch (InterruptedException e) {
           e.printStackTrace();
       } catch (ExecutionException e) {
           e.printStackTrace();
       } 
   }
  • 设置超时过期时间
/**
     * // 失败回滚状态
     * @param result
     * @param id 单据主键id
     * @return java.util.concurrent.Future<java.lang.Boolean>
     */
     @Async
    public void updateFailure(Future<Boolean> result, String id) {

        try {
        	//设置了超时时间,若超时会抛出TimeoutException 
            if(!result.get(60, TimeUnit.SECONDS)) {
                // 失败回滚状态
                ......
                ......
                log.info("失败状态回滚 id: {}", id);
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        } catch (TimeoutException e) {
            e.printStackTrace();
        }
    }

设置超时时间后,主线程里面也应该开启单独的线程来处理结果,不然要等待上一个任务执行完,时间可能过长。所以再结果处理方面上面再用@Async注解。

参考博客: Spring使用@Async注解.

展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客
应支付0元
点击重新获取
扫码支付

支付成功即可阅读