SpringBoot异步调用 实现方式

我们在项目中,经常会遇到异步调用的问题,异步调用的效果就是主线程可以提前返回,然后交由任务子线程进行处理。在SpringBoot工程中,如何实现异步;简单汇总了一下二种方法。

第一种:自定义线程类。

第二种:使用@Async和@EnableAsync注解;

一.自定义线程类

新建线程类实现Runnable接口:

Controller类中调用:

执行结果:

从结果中可以看出,Controller类的thread3方法执行时间间隔为0秒,而ThreadTask类的run方法执行时间间隔为3秒。和我们预期的相符。

二.使用@Async和@EnableAsync注解

第一步:首先使用@EnableAsync注解开启异步调用功能

该注解可以放在以下几个位置:

1:启动类上方

@SpringBootApplication
@EnableAsync
public class SjcjApplication{
    public static void main(String[] args) {
        SpringApplication.run(SjcjApplication.class, args);
    }
}

2:当前需要执行异步调用的类上方

3:配置类上方使用

在SpringBoot中 该配置类不仅可以开启异步调用开启异步调用,我们还可以使用线程池对开启的异步线程进行统一管理。

package com.inspur.tax.config;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

/**
* @ClassName TaskPoolConfig 
* @Description 线程池配置
* @author Tony
* @date 2020年3月14日 上午9:53:27 
* @version 1.0
 */
@EnableAsync
@EnableScheduling
@Configuration
public class TaskPoolConfig {

    @Bean(name = "taskPoolExecutor")
    public ThreadPoolExecutor getThreadPoolExecutor() {
        BlockingQueue<Runnable> bqueue = new ArrayBlockingQueue<Runnable>(20);
        ThreadPoolExecutor pool = new ThreadPoolExecutor(5,10,60, TimeUnit.MILLISECONDS,bqueue);
        pool.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());

        return pool;
    }

    @Bean(name = "asyncPoolExecutor")
    public ThreadPoolTaskExecutor getAsyncThreadPoolTaskExecutor() {
        ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
        taskExecutor.setCorePoolSize(5);
        taskExecutor.setMaxPoolSize(10);
        taskExecutor.setQueueCapacity(20);
        taskExecutor.setKeepAliveSeconds(12000);
        taskExecutor.setThreadNamePrefix("AsyncPool-");
        taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        taskExecutor.setWaitForTasksToCompleteOnShutdown(true);
        taskExecutor.setAwaitTerminationSeconds(60);
        taskExecutor.initialize();
        return taskExecutor;
    }

}

配置类中,如果不指定 Executor ,则默认使用 SimpleAsyncTaskExecutor。

新建TestAsyncService类,并在该类中新建serviceThread4方法,在serviceThread4方法上加@Async注解

然后在Controller调用:将TestAsyncService类注入到TestAsyncController类,并新建thread4方法,其中是调用taService.serviceThread4();异步方法。

执行结果:

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章