@EnableAsync

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(AsyncConfigurationSelector.class)
public @interface EnableAsync {
Class<? extends Annotation> annotation() default Annotation.class;
boolean proxyTargetClass() default false;
AdviceMode mode() default AdviceMode.PROXY;
int order() default Ordered.LOWEST_PRECEDENCE;
}

@EnableAsync注解即开启Spring对方法异步执行的能力,需要和注解@Configuration配合使用。

@Configuration
@EnableAsync
public class AppConfig { }

也可以自定义线程池

@Configuration
@EnableAsync
public class AppConfig implements AsyncConfigurer { @Override
public Executor getAsyncExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(7);
executor.setMaxPoolSize(42);
executor.setQueueCapacity(11);
executor.setThreadNamePrefix("MyExecutor-");
executor.initialize();
return executor;
} @Override
public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
return MyAsyncUncaughtExceptionHandler();
} }

@Async

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Async {
String value() default "";
}

在要异步执行的方法上使用@Async注解,下面是一个没有返回值,一个带有返回值的异步调用的示例。

@Component
public class AsyncTask { @Async
public void task1() {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
} @Async
public Future<String> task2() {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return new AsyncResult<String>("javastack");
}
}

测试代码

@RunWith(SpringRunner.class)
@SpringBootTest
public class AsyncTest { private final static Logger log = LoggerFactory.getLogger(AsyncTest.class); @Autowired
private AsyncTask asyncTask; @Test
public void testTask1(){
log.info("start");
asyncTask.task1();
log.info("finish");
} @Test
public void testTask2() {
log.info("start");
Future<String> future = asyncTask.task2();
while (true) {
if (future.isDone()) {
try {
log.info("result is " + future.get());
} catch (Exception e) {
e.printStackTrace();
}
break;
}
}
log.info("finish");
} }

注意事项

1、使用注意

@Async只能使用到被代理的对象方法上,即代理类的入口方法处,且方法必须是public的。

2、事务处理机制

使用@Async异步注解不能和@Transaction事务注解在同一个方法上同时使用,不然事务注解将无效。

要使用事务,需要把事务注解提取到方法里面的子方法上。

最新文章

  1. UVA 562 Dividing coins --01背包的变形
  2. 函数的重载与 泛型(generic)有什么不同?
  3. Windows平台Atom编辑器的常用快捷键小抄Cheat Sheet
  4. iOS打电话
  5. python多重继承:
  6. tp接支付宝接口签名不相等解决办法 接口版本3.3 tp版本3.1
  7. Java FutureTask理解
  8. cf472D Design Tutorial: Inverse the Problem
  9. 初学者应学会如何加快seo
  10. 28.按要求编写一个Java应用程序: (1)定义一个类,描述一个矩形,包含有长、宽两种属性,和计算面积方法。 (2)编写一个类,继承自矩形类,同时该类描述长方体,具有长、宽、高属性, 和计算体积的方法。 (3)编写一个测试类,对以上两个类进行测试,创建一个长方体,定义其长、 宽、高,输出其底面积和体积。
  11. 利用PowerDesigner15在win7系统下对MySQL 进行反向工程(一)
  12. Goldwell平台官网简介-欢迎咨询经理罗琪
  13. yii批量插入的方法
  14. cannot import name &#39;_imaging&#39; from &#39;PIL&#39;
  15. Springboot项目打包成jar运行2种方式
  16. SVN上线步骤笔记
  17. python+stomp+activemq
  18. linux常用命令:用SecureCRT来上传和下载文件
  19. 泪奔的ie
  20. C#文字转换语音朗读或保存MP3、WAV等格式

热门文章

  1. NPOI 中的公式列的值的获取
  2. RHEL SHELL快捷键
  3. android开发学习---linux下开发环境的搭建&amp;&amp; android基础知识介绍
  4. MYSQL-innodb性能优化几个点
  5. rviz学习笔记(二)——Markers: Points and Lines (C++) 点和线
  6. Java 图片矢量压缩
  7. SQL 中 Arg的使用
  8. 使用Openssl的AES加密算法
  9. js获取日期:昨天今天和明天、后天
  10. SharePoint 2010、2013多个域之间互信(Domain Trust)的设计与实施