前言

在本篇文章中,我们主要讨论spring异步编程的一些相关知识,不涉及实战。springboot版本2.2.1

TaskExecutor

spring2.0后提出TaskExecutor接口,作为任务执行者抽象。TaskExecutor源码:


@FunctionalInterface
public interface TaskExecutor extends Executor {
@Override
void execute(Runnable task); }

spring框架提供了一定的TaskExecutor实现类,这些实现类可以完成几乎所有使用场景的覆盖,所以,大多数情况下,我们没有必要实现某个TaskExecutor

  1. SyncTaskExecutor

    代码如下:

public class SyncTaskExecutor implements TaskExecutor, Serializable {
@Override
public void execute(Runnable task) {
Assert.notNull(task, "Runnable must not be null");
task.run();
} }

可以发现,提交给SyncTaskExecutor的任务都是直接在当前线程中执行

  1. SimpleAsyncTaskExecutor
    @Override
public void execute(Runnable task, long startTimeout) {
Assert.notNull(task, "Runnable must not be null");
Runnable taskToUse = (this.taskDecorator != null ? this.taskDecorator.decorate(task) : task);
if (isThrottleActive() && startTimeout > TIMEOUT_IMMEDIATE) {
this.concurrencyThrottle.beforeAccess();
doExecute(new ConcurrencyThrottlingRunnable(taskToUse));
}
else {
doExecute(taskToUse);
}
} protected void doExecute(Runnable task) {
Thread thread = (this.threadFactory != null ? this.threadFactory.newThread(task) : createThread(task));
thread.start();
}

提交给SimpleAsyncTaskExecutor的任务每次都新建一个线程来执行提交的任务。

  1. ThreadPoolTaskExecutor

    如果觉得SimpleAsyncTaskExecutor每次都需要新建线程不可取,就可以使用这个,ThreadPoolTaskExecutor改用线程池来管理并重用处理任务异步执行的工作线程。其中,ThreadPoolTaskExecutor的线程池功能是使用的jdk的ThreadPoolExecutor来实现的。

@Override
public void execute(Runnable task) {
Executor executor = getThreadPoolExecutor();
try {
executor.execute(task);
}
catch (RejectedExecutionException ex) {
throw new TaskRejectedException("Executor [" + executor + "] did not accept task: " + task, ex);
}
}
  1. ConcurrentTaskExecutor

    ConcurrentTaskExecutorJava5ExecutorspringTaskExecutor搭建了一道桥梁使得我们可以将Executor框架下的某些实现类以TaskExecutor的形式公开来,如果我们感觉ThreadPoolTaskExecutor封装的java.util.concurrent.ThreadPoolExecutor不足以満足当前场景需要,那么可以构建需要的Executor实例,比如通过Executors.newXXXThreadPool(),然后以ConcurrentTaskExecutor对其进行封装,封装后获得的ConcurrentTaskExecutor即获得相应Executor的能力,但它现在是以TaskExecutor的样子示人气如下所示:

Executor executor =Executors .newScheduledThreadPool (10);
TaskExecutor taskExecutor = new ConcurrentTaskExecutor (executor):

最后

异步线程的一些相关知识知道了。接下来就是怎么去使用了。

参考:

  1. Spring Boot Async Task Executor
  2. Spring 官方文档
  3. 新手也能看懂的 SpringBoot 异步编程指南
  4. TaskExecutionAutoConfiguration

最新文章

  1. .NET跨平台之旅:升级至ASP.NET 5 RC1,Linux上访问SQL Server数据库
  2. Oracle 删除重复数据只留一条
  3. web安全之sql注入报错型注入
  4. PHP程序员7小时学会Kotlin系列
  5. IOS block使用中碰到的一个小坑
  6. DB2缓冲池、表空间
  7. 段和RSEG用法
  8. MsSqlServer 语句
  9. ajax提交与上传文件同步
  10. Linux通过编辑器vi使用介绍
  11. OpenStack(企业私有云)万里长征第五步——虚拟机Migrate&Resize
  12. mysql别名的使用
  13. sys.argv[]用法-转载
  14. 从CSDN到cnblogs
  15. lua 调用参数报错(a userdata value)
  16. Angular2 之父子组件交互方式
  17. PSR-PHP开发规范(本文版权归作者:luluyrt@163.com)
  18. 新特技软件(Analyzer)添加新用户
  19. springboot集成druid+mybatis连接oracle数据库
  20. 关于snowflake算法生成的ID转换为JS的数字类型由于过大导致JS精度丢失的问题

热门文章

  1. VGG梳理
  2. Linux yum 包 下载地址
  3. MVC框架与增强
  4. 6-网页,网站,微信公众号基础入门(PHP学习_1)
  5. 高考数学答卷策略[K12论坛转载]
  6. STL中find和sort的用法总结
  7. python pycryptodome 加密解密
  8. 安装和启动ElasticSearch服务遇到的几个问题
  9. R 语言输入输出 读取命令函参数
  10. 使用kubectl访问kubernetes集群