1.pom依赖

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.1.9.RELEASE</version>
</dependency>

2.编写异步方法

package com.yun.base.custom.event;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component; @Component
public class AsyncThread { private static final Logger LOGGER = LoggerFactory.getLogger(AsyncThread.class); @Async
public void runMethodAsync() {
Thread t = Thread.currentThread();
try {
LOGGER.debug("异步方法1执行中");
t.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
} @Async
public void runMethodAsync2() {
Thread t = Thread.currentThread();
try {
LOGGER.debug("异步方法2执行中");
t.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
} @Async
public void runMethodAsync3() {
Thread t = Thread.currentThread();
try {
LOGGER.debug("异步方法3执行中");
t.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

2.配置线程池及开启注解

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:task="http://www.springframework.org/schema/task"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"
default-lazy-init="true"> <context:component-scan base-package="com.yun.base.custom.event" /> <task:executor id="eventExecutor" pool-size="2" />
<task:annotation-driven executor="eventExecutor"/> </beans>

3.测试

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>4.1.9.RELEASE</version>
</dependency>
package test.war;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import com.yun.base.custom.event.AsyncThread; @RunWith( SpringJUnit4ClassRunner.class )
@ContextConfiguration( locations = { "classpath:conf/async.xml" } )
public class JunitTest { private static final Logger LOGGER = LoggerFactory.getLogger(JunitTest.class); @Autowired
private ApplicationContext applicationContext; @Test
public void asyncTest() {
AsyncThread asyncThread = (AsyncThread) applicationContext.getBean("asyncThread"); LOGGER.debug("开始调用");
asyncThread.runMethodAsync();
asyncThread.runMethodAsync2();
asyncThread.runMethodAsync3();
LOGGER.debug("结束调用"); try {
Thread.currentThread().sleep(20000);
} catch (InterruptedException e) {
e.printStackTrace();
} } }

4.结果分析

2017-09-11 15:05:34.323 [main] DEBUG test.war.JunitTest - 开始调用
2017-09-11 15:05:34.338 [main] DEBUG test.war.JunitTest - 结束调用
2017-09-11 15:05:34.370 [eventExecutor-1] DEBUG com.yun.base.custom.event.AsyncThread - 异步方法1执行中
2017-09-11 15:05:34.370 [eventExecutor-2] DEBUG com.yun.base.custom.event.AsyncThread - 异步方法2执行中
2017-09-11 15:05:44.378 [eventExecutor-2] DEBUG com.yun.base.custom.event.AsyncThread - 异步方法3执行中

可以看到在主线程 main 下执行完成之后,另开启了2个线程执行异步方法1,2,然后10秒之后线程2继续执行异步方法3。

这里我设置的线程数为2,所以第一论执行的时候,同时只能有2个线程来执行异步方法,异步方法3等待,当有线程释放的时候继续执行异步方法3。

Spring异步调用注解@Async的使用的更多相关文章

  1. 如何在项目中使用Spring异步调用注解@Async

    本文主要介绍如何使用Spring框架提供的异步调用注解@Async,异步线程池配置.异常捕获处理. 开启@Async注解支持 使用@Async注解的之前,必须在项目中启动时调用@EnableAsync ...

  2. Spring异步调用原理及SpringAop拦截器链原理

    一.Spring异步调用底层原理 开启异步调用只需一个注解@EnableAsync @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTI ...

  3. Spring Boot中实现异步调用之@Async

    一.什么是异步调用 “异步调用”对应的是“同步调用”,同步调用指程序按照定义顺序依次执行,每一行程序都必须等待上一行程序执行完成之后才能执行:异步调用指程序在顺序执行时,不等待异步调用 的语句返回结果 ...

  4. 161107、spring异步调用,完美解决!

    项目中,用户抢单,下单需要向对方推送消息,但是加上推送就会造成抢单和下单性能降低,反应变慢,因为抢单下单动作跟推送部分是同步的,现在想改成异步推送. 在Java应用中,绝大多数情况下都是通过同步的方式 ...

  5. 161021、spring异步调用,完美解决!

    前言 项目中,用户抢单,下单需要向对方推送消息,但是加上推送就会造成抢单和下单性能降低,反应变慢,因为抢单下单动作跟推送部分是同步的,现在想改成异步推送. 在Java应用中,绝大多数情况下都是通过同步 ...

  6. 如何在Spring异步调用中传递上下文

    以下文章来源于aoho求索 ,作者aoho 1. 什么是异步调用? 异步调用是相对于同步调用而言的,同步调用是指程序按预定顺序一步步执行,每一步必须等到上一步执行完后才能执行,异步调用则无需等待上一步 ...

  7. Spring异步任务处理,@Async的配置和使用

    本文转自http://blog.csdn.net/clementad/article/details/47403185 感谢作者 这个注解用于标注某个方法或某个类里面的所有方法都是需要异步处理的.被注 ...

  8. spring boot 学习(十一)使用@Async实现异步调用

    使用@Async实现异步调用 什么是”异步调用”与”同步调用” “同步调用”就是程序按照一定的顺序依次执行,,每一行程序代码必须等上一行代码执行完毕才能执行:”异步调用”则是只要上一行代码执行,无需等 ...

  9. SpringBoot | 第二十一章:异步开发之异步调用

    前言 上一章节,我们知道了如何进行异步请求的处理.除了异步请求,一般上我们用的比较多的应该是异步调用.通常在开发过程中,会遇到一个方法是和实际业务无关的,没有紧密性的.比如记录日志信息等业务.这个时候 ...

随机推荐

  1. Linux上rsync配置

    一.服务器端配置1.rsyncd.conf文件说明uid = rsync     #用户,用来控制用户访问模块目录的读写权限gid = rsync     #组,用来控制组访问模块目录的读写权限use ...

  2. LeetCode--443--压缩字符串(未看)

    问题描述: 给定一组字符,使用原地算法将其压缩. 压缩后的长度必须始终小于或等于原数组长度. 数组的每个元素应该是长度为1 的字符(不是 int 整数类型). 在完成原地修改输入数组后,返回数组的新长 ...

  3. LOJ6036编码

    每个串拆成两个,都插入trie数. 把trie树建出来后,每一条从根到叶子的链上最多只能有一个变量为1. 这是个经典的前后缀优化2-sat建图的套路. 树上的做法也就是边dfs边做而已. #inclu ...

  4. 【洛谷p2142】高精度减法

    高精度减法第一遍没有过 高精度减法[传送门] 洛谷算法标签: 总之技术都在高精上了吧. 附代码: #include<iostream> #include<cstdio> #in ...

  5. 性能测试工具 Web Service 性能测试工具比较

    [转自]https://testerhome.com/topics/3003 背景 希望选择一款Web Service性能测试工具,能真实模拟大量用户访问网站时的请求,从而获取服务器当前的请求处理能力 ...

  6. node模块之path——path.join和path.resolve的区别

    1.path.join([...paths]) path.join() 方法使用平台特定的分隔符把全部给定的 path 片段连接到一起,并规范化生成的路径. 长度为零的 path 片段会被忽略. 如果 ...

  7. [POJ题目分类][转]

    Hint:补补基础... 初期:一.基本算法:     (1)枚举. (poj1753,poj2965)     (2)贪心(poj1328,poj2109,poj2586)     (3)递归和分治 ...

  8. Web Services的学习一

    1.Web Services可以将应用程序转换成为网络应用程序,也就是说可以通过Web Services,应用程序可以向全世界发布信息,或者提供功能. 而且通过Web Services发布的,可以被其 ...

  9. 剑指 offer 面试题31 连续子数组的最大和(动态规划)

    求连续子数组的最大和 题目描述 给定一个整形数组,有正数也有负数,数组中连续一个或多个组成一个子数组,求所有子数组的和的最大值,要求时间复杂度为O(n); 测试用例 给定数组 {1,-2,3,10,- ...

  10. ElasticSearch安装部署(Windows)

    测试版本:elasticsearch-5.1.1 1.解压elasticsearch-5.1.1.zip. 2.执行elasticsearch.bat启动服务,启动画面如下: 3.访问ElasticS ...