异步方法(@Async)

Exisi 2022-11-28 08:14:54
Categories: Tags:

 

 

参数

描述

value

指定异步操作的限定符值。

可用于确定执行异步操作时要使用的目标执行器,与特定执行器或TaskExecutor bean定义的限定符值(或bean名称)匹配。

在类级别@Async注释上指定时,表示给定的执行器应用于类中的所有方法。方法级使用异步#值总是覆盖在类级设置的任何值。

 

<!--扫描注解,其中包括@Async -->

<context:component-scan base-package="com.test" />

<!-- 支持异步方法执行, 指定一个缺省的executor@Async使用-->

<task:annotation-driven executor="defaultAsyncExecutor" />

<task:executor id="defaultAsyncExecutor" pool-size="100-10000" queue-capacity="10" keep-alive="5" />

解析

<task:executor />配置参数:

参数

描述

id

当配置多个executor时,被@Async(id)指定使用;也被作为线程名的前缀。

pool-size

最小连接池数

core size

最小的线程数,缺省:1

max size

最大的线程数,缺省:Integer.MAX_VALUE

queue-capacity

当最小的线程数已经被占用满后,新的任务会被放进queue里面,当这个queuecapacity也被占满之后,pool里面会创建新线程处理这个任务,直到总线程数达到了max size,这时系统会拒绝这个任务并抛出TaskRejectedException异常(缺省配置的情况下,可以通过rejection-policy来决定如何处理这种情况)。

缺省值为:Integer.MAX_VALUE

keep-alive

超过core size的那些线程,任务完成后,再经过这个时长(秒)会被结束掉

rejection-policy

pool已经达到max size的时候,如何处理新任务

ABORT(缺省)

抛出TaskRejectedException异常,然后不执行DISCARD:不执行,也不抛出异常

DISCARD_OLDEST

丢弃queue中最旧的那个任务

CALLER_RUNS

不在新线程中执行任务,而是有调用者所在的线程来执行

示例

//在类或方法上添加@Async,当调用该方法时,则该方法即是用异常执行的方法单独开个新线程执行

@Async(“可以指定执行器id,也可以不指定”)

public static void testAsyncVoid(){

    try{

        //让程序暂停100秒,相当于执行一个很耗时的任务

        System.out.println(“异常执行打印字符串”);

        Thread.sleep(100000);

    }

    catch (InterruptedException e){

        e.printStackTrace();

    }

}