首页 > 其他分享 >异步注解@Async使用自定义线程池

异步注解@Async使用自定义线程池

时间:2023-06-25 20:44:05浏览次数:42  
标签:自定义 void 线程 注解 Async 方法 public

1.@Async注解

@Async是java中一个注解,其作用就是加上该注解的类或方法能够异步执行任务,该注解添加到方法上时,表示该方法是异步方法,添加到类上时,表示该类中的所有方法都是异步方法。
该注解的代码为:image
可以看出其是作用在类和方法上,能够在运行时被获取到。
当在使用@Async时,如果不指定具体的线程池名称,那么其使用的是默认线程池SimpleAsyncTaskExecutor。而该线程池的默认配置为(在TaskExecutionProperties中):

  • 核心线程数:8
  • 容量:Integer.MAX_VALUE
  • 最大线程数:Integer.MAX_VALUE
  • 空闲线程存活时间:60s
  • 允许核心线程超时:true

由上面的配置可知在并发量很大的情况下,其会没有限制的创建线程,当线程数量到达一定程度之后,就会影响相应的性能了。因此,在使用@Async注解时,最好使用自定义线程池,也就是在注解中添加自定义线程池的名字。

2.示例代码

2.1 开启异步

添加@EnableAsync注解开启异步

@SpringBootApplication
@EnableAsync
public class Test2Application {

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

}

2.2 配置自定义线程池

配置其线程池的实例名称为myselfExecutor,线程为myThread-开头的系列

@Configuration
@Slf4j
public class ThreadPoolConfig {

    private static final AtomicInteger poolNumber = new AtomicInteger(1);

    @Bean("myselfExecutor")
    public Executor myselfExecutor() {
        ThreadFactory threadFactory = new ThreadFactory() {
            @Override
            public Thread newThread(Runnable r) {
                return new Thread(null, r, "myThread-" + poolNumber.getAndIncrement(), 0);
            }
        };
        ThreadPoolExecutor executor = new ThreadPoolExecutor(10,
                20,
                30,
                TimeUnit.SECONDS,
                new LinkedBlockingDeque<>(100),
                threadFactory);
        return executor;
    }

}

2.3 编写相应的方法与实现类

这边写了两个方法,一个testOne(),一个testTwo(),其中testOne()方法指明使用的线程池,而testTwo()方法则是使用默认的线程池。

public interface TestService {

    void testOne();

    void testTwo() throws InterruptedException;

}



@Service
@Slf4j
public class TestServiceImpl implements TestService{
    @Override
    @Async("myselfExecutor")
    public void testOne() {
        log.info("one test,当前线程为:" + Thread.currentThread().getName());
    }

    @Override
    @Async
    public void testTwo() throws InterruptedException {
        log.info("two test,当前线程为:" + Thread.currentThread().getName());
        Thread.sleep(1000);
    }
}

2.4 编写controller

写相关TestController的测试代码

@RestController
public class TestController {

    @Autowired
    TestService testService;

    @GetMapping("/get")
    public void get() throws InterruptedException {
        testService.testOne();
        testService.testTwo();
        testService.testOne();
    }


}

2.5 运行结果

image
可以从结果看出,执行testOne()方法的线程为myThread系列的线程,而执行testTwo()方法的线程为SimpleAsyncTaskExecutor。

3.@Async无效的情况

  • 没有加@EnableAsync注解
  • @Async修饰的方法不是public方法
  • @Async修饰的方法被static修饰了
  • 调用方法和@Async方法在同一个类中
  • @Async修饰的方法的返回值不是void或Future。ps:这个情况是会报错

标签:自定义,void,线程,注解,Async,方法,public
From: https://www.cnblogs.com/mcj123/p/17493797.html

相关文章

  • QT为什么只能由主线程操作UI
    QT为什么只能由主线程操作UI背景QT中,每次子线程去更新Ui都要通过信号槽去刷。其实不光是QT,很多GUI程序框架都是这么规定的。主线程:主线程是唯一允许创建QApplication或者QCoreApplication对象的,并且调用exec()启动事件循环的线程。原因直接原因:UI线程负责和用户交互,因此不能......
  • Java多线程-Lesson02
    一.Lamda表达式λ是希腊字母表的第十一位字母,英文名是LambdaLamda表达式的出现主要是为了避免匿名内部类过多的原因,它属于函数式编程的范畴 为什么要使用Lamda表达式?避免匿名内部类定义过多可以让你的代码看起来很简洁去掉了没有意义的代码,只留下一堆核心逻辑主要使用在......
  • java 中的多线程问题
    结论  全局变量 多线程非安全  (堆) static局部变量 多线程安全  (栈) fina也可以安全1:线程调用时,每一个线程都拥有一套完整的调用栈帧,栈帧中包含完整的调用方法名,方法的局部变量。而且栈是先入后出,调用方法时入栈,方法结束是出栈。2:使用线程池时需要注意参数问......
  • SpringBoot用@Async实现异步调用
    @Async的使用1、在启动类中加上注解@EnableAsync启用异步 2、在使用异步的方法上加上注解@Async,自己写一个线程池,指定线程池。不建议使用默认的线程池。 在线程池应用中,参考阿里巴巴java开发规范:线程池不允许使用Executors去创建,不允许使用系统默认的线程池,推荐通过T......
  • C# .NET6结束UI线程
    在.NET6项目中,不再支持Thread.Abort:Thread.AbortisnotsupportedandthrowsPlatformNotSupportedException.原因是Thread.Abort可能导致资源泄漏,1.不正常的关闭,导致线程运行过程中待释放资源的业务代码,未能完成执行。2.异常捕获,业务模块未添加捕获、业务模块添加了捕获但......
  • 1.element表头居中内容左对齐, 2.自定义el-table中新增编辑表格不刷新的问题。
    一、<el-table :header-cell-style="{'text-align':'left'}">...<el-table-column:cell-style="{'text-align':'left'}">...</el-table-column></el-table> 二、this.$se......
  • 自定义博客园---返回顶部
    效果就是在页面最右下角的地方有一个小火箭队图标,如下图: 在博客园的设置中,在页首HTML代码中添加如下:<style>#back-top{position:fixed;bottom:10px;right:5px;z-index:99;}#back-topspan{width:50px;height:64px;dis......
  • 自定义异常的作用
    自定义异常的作用,就是在程序中遇到异常的时候能够吧异常转换为相对应的可识别的错误类型,把相应的响应方式记录下来并抛出,最终在最外层的函数中捕获到这个自定义异常以便于从中取出合适的响应类型,返回给前端,而不是一味地搪塞,返回给前端空的数据。核心思想还是包装,把难懂的具......
  • 前端Vue仿京东加入购物车弹框立即购买弹框shopDialog自定义弹框内容
    前端Vue仿京东加入购物车弹框立即购买弹框shopDialog自定义弹框内容,下载完整代码请访问uni-app插件市场地址:https://ext.dcloud.net.cn/plugin?id=13183效果图如下:cc-shopDialog使用方法使用注意:该插件需引用cc-radioBtnBox插件和cc-numbox插件两个插件库cc-radioBtn......
  • 前端Vue自定义地址展示地址选择地址管理组件
    前端Vue自定义地址展示地址选择地址管理组件,下载完整代码请访问uni-app插件市场地址:https://ext.dcloud.net.cn/plugin?id=13181效果图如下:cc-addressBox使用方法<!--addressItem:地址条目数据@click:地址点击设置事件--><cc-addressBox:addressItem="item"@click="......