springboot2.0 @Async异步调用

标签: springboot2.0 Async
6人阅读 评论(0) 收藏 举报
分类:

1. App上加@EnableAsync注解

@SpringCloudApplication
@EnableAsync
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

}

2. 定义线程池

@Configuration
public class MyConfiguration {

    @Bean("taskExecutor")
    public Executor taskExecutor(){
        ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
        taskExecutor.setWaitForTasksToCompleteOnShutdown(true);//线程池关闭的时候等待所有任务都完成再继续销毁其他的Bean
        taskExecutor.setAwaitTerminationSeconds(60);//设置线程池中任务的等待时间,如果超过这个时候还没有销毁就强制销毁,以确保应用最后能够被关闭,而不是阻塞住
        taskExecutor.setCorePoolSize(4);
        taskExecutor.setMaxPoolSize(8);
        taskExecutor.setQueueCapacity(Integer.MAX_VALUE);//缓冲执行任务的队列
        taskExecutor.setKeepAliveSeconds(60);//当超过了核心线程出之外的线程在空闲时间到达之后会被销毁
        taskExecutor.setThreadNamePrefix("kanjia-websocket-thread-");
        return taskExecutor;
    }

}

加入下面的设置,可以等待任务执行完成在关闭线程池

taskExecutor.setWaitForTasksToCompleteOnShutdown(true);//线程池关闭的时候等待所有任务都完成再继续销毁其他的Bean
taskExecutor.setAwaitTerminationSeconds(60);//设置线程池中任务的等待时间,如果超过这个时候还没有销毁就强制销毁,以确保应用最后能够被关闭,而不是阻塞住

3. 定义异步任务类,必须单独为一个类,通过@Async定义异步方法

@Component
public class Task {

    @Async("taskExecutor")  
    public void task1() throws InterruptedException{  
        long currentTimeMillis = System.currentTimeMillis();  
        Thread.sleep(1000);  
        long currentTimeMillis1 = System.currentTimeMillis();  
        System.out.println("task1任务耗时:"+(currentTimeMillis1-currentTimeMillis)+"ms");  
    }  

    @Async("taskExecutor")  
    public void task2() throws InterruptedException{  
        long currentTimeMillis = System.currentTimeMillis();  
        Thread.sleep(2000);  
        long currentTimeMillis1 = System.currentTimeMillis();  
        System.out.println("task2任务耗时:"+(currentTimeMillis1-currentTimeMillis)+"ms");  
    }  
    @Async("taskExecutor")  
    public void task3() throws InterruptedException{  
        long currentTimeMillis = System.currentTimeMillis();  
        Thread.sleep(3000);  
        long currentTimeMillis1 = System.currentTimeMillis();  
        System.out.println("task3任务耗时:"+(currentTimeMillis1-currentTimeMillis)+"ms");  
    }
}

4. 调用异步方法

@RestController
public class HiController {
    @Autowired
    private Task task;

    @RequestMapping(value="/hi")
    public String hi() throws Exception {
        long currentTimeMillis = System.currentTimeMillis();  
        task.task1();  
        task.task2();  
        long currentTimeMillis1 = System.currentTimeMillis();  
        System.out.println("task任务总耗时:"+(currentTimeMillis1-currentTimeMillis)+"ms");
        return "task任务总耗时:"+(currentTimeMillis1-currentTimeMillis)+"ms";
    }
}

访问/hi,可以看到输出:

task任务总耗时:19ms
task1任务耗时:1001ms
task2任务耗时:2039ms
查看评论

Spring源码学习之:@Async 方法上添加该注解实现异步调用的原理

spring 在扫描bean的时候会扫描方法上是否包含@async的注解,如果包含的,spring会为这个bean动态的生成一个子类,我们称之为代理类(?),代理类是继承我们所写的bean的,然后把代...
  • xiaobao5214
  • xiaobao5214
  • 2017-03-20 16:41:24
  • 1128

spring中使用@Async注解进行异步处理

引言: 在Java应用中,绝大多数情况下都是通过同步的方式来实现交互处理的;但是在处理与第三方系统交互的时候,容易造成响应迟缓的情况,之前大部分都是使用多线程来完成此类任务,其实,在spring 3....
  • qq_21033663
  • qq_21033663
  • 2016-06-02 09:59:50
  • 11091

C# 中async await 语法 异步调用WebService

static void Main(string[] args) { getdata(); Console.ReadKey(); ...
  • cctvcqupt
  • cctvcqupt
  • 2015-08-21 01:42:07
  • 831

SpringBoot集成篇(二) 异步调用Async

什么是异步调用? 异步调用是相对于同步调用而言的,同步调用是指程序按预定顺序一步步执行,每一步必须等到上一步执行完后才能执行,异步调用则无需等待上一步程序执行完即可执行。 如何实现异步调用? 多线...
  • v2sking
  • v2sking
  • 2017-05-28 22:46:02
  • 9294

使用Spring @Async异步执行方法的笔记

测试代码:   Java代码   @RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration(locat...
  • yiluoAK_47
  • yiluoAK_47
  • 2014-10-28 15:26:00
  • 5223

Dubbox 基本特性之异步调用

相对比与前一个小节来说,异步调用的功能也是很实用的,现在异步化的操作是越来越多了,异步化的好处也是比较明显的,可以加快后台的处理效率,做到代码直接的解耦,Dubbo就是一个支持异步调用的RPC框架  ...
  • linuu
  • linuu
  • 2016-12-27 17:15:48
  • 4007

Spring异步执行(@Async)2点注意事项

Spring中可以异步执行代码,注解方式是使用@Async注解。  原理、怎么使用,就不说了。  写2点自己遇到过的问题。1.方法是公有的  // 通知归属人 @Async public void n...
  • FansUnion
  • FansUnion
  • 2015-10-22 09:07:33
  • 1810

56. spring boot中使用@Async实现异步调用

什么是“异步调用”?        “异步调用”对应的是“同步调用”,同步调用指程序按照定义顺序依次执行,每一行程序都必须等待上一行程序执行完成之后才能执行;异步调用指程序在顺序执行时,不等待异步调用...
  • linxingliang
  • linxingliang
  • 2016-08-29 09:26:15
  • 847

WCF异步调用模式

异步调用操作系统发展到今天已经十分精巧,线程就是其中一个杰作。操作系统把 CPU 处理时间划分成许多短暂时间片,在时间 T1 执行一个线程的指令,到时间 T2又执行下一线程的指令,各线程轮流执行,结果...
  • u012135077
  • u012135077
  • 2015-11-23 17:38:45
  • 522

浅谈WebService开发二(同步与异步调用)

上文 http://blog.csdn.net/wayne20018891/article/details/7578040 已经跟大家说了,如果创建一个webservice和简单的调用,本文将注重we...
  • wayne20018891
  • wayne20018891
  • 2012-05-21 16:09:52
  • 9429
    个人资料
    专栏达人
    等级:
    访问量: 1万+
    积分: 391
    排名: 18万+
    博客专栏
    文章存档
    最新评论