• Spring异步调用注解@Async的使用


    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。

  • 相关阅读:
    Angular2.0 基础:双向数据绑定 [(ngModel)]
    Angular2.0 基础: 环境搭建
    将已编写的静态的网页发布到github上
    kndo grid:通过checkbox 实现多选和全选
    Kendo Grid:将Edit button 移到grid view 得顶部
    溢出文本显示省略号处理
    空MVC项目找不到System.Web.Optimization的处理办法
    cannot find module 'xml2js'
    jquery mobile RedirectToAction url地址不更新
    soapUI 时间格式
  • 原文地址:https://www.cnblogs.com/yun965861480/p/7505112.html
Copyright © 2020-2023  润新知