在Web应用程序中使用线程并不常见,尤其是当您必须开发长期运行的任务时。

考虑到spring,我们必须格外注意并使用它已经提供的工具,而不是生成我们自己的线程。 我们希望线程由spring管理,因此能够在不产生任何影响的情况下使用应用程序的其他组件,并在不进行任何工作的情况下优雅地关闭应用程序。

Spring提供TaskExecutor作为与执行程序打交道的抽象。 Spring的TaskExecutor接口与java.util.concurrent.Executor接口相同。 Spring发行版中包含许多TaskExecutor的预构建实现,您可以从官方文档中找到有关它们的更多信息。 通过为您的Spring环境提供TaskExecutor实现,您将能够将TaskExecutor注入到您的bean中并可以访问托管线程。

package com.gkatzioura.service;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.core.task.TaskExecutor;
import org.springframework.stereotype.Service;
import java.util.List;/*** Created by gkatzioura on 4/26/17.*/
@Service
public class AsynchronousService {@Autowiredprivate ApplicationContext applicationContext;@Autowiredprivate TaskExecutor taskExecutor;public void executeAsynchronously() {taskExecutor.execute(new Runnable() {@Overridepublic void run() {//TODO add long running task}});}
}

第一步是将TaskExecutor配置添加到我们的spring应用程序中。

package com.gkatzioura.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.task.TaskExecutor;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;import java.util.concurrent.Executor;/*** Created by gkatzioura on 4/26/17.*/
@Configuration
public class ThreadConfig {@Beanpublic TaskExecutor threadPoolTaskExecutor() {ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();executor.setCorePoolSize(4);executor.setMaxPoolSize(4);executor.setThreadNamePrefix("default_task_executor_thread");executor.initialize();return executor;}}

一旦我们的执行程序设置完成,过程就很简单。 我们将执行程序注入到spring组件中,然后提交包含要执行任务的Runnable类。

由于我们的异步代码可能还需要与应用程序的其他组件进行交互并注入它们,因此一种不错的方法是创建原型范围内的可运行实例。

package com.gkatzioura;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;/*** Created by gkatzioura on 10/18/17.*/
@Component
@Scope("prototype")
public class MyThread implements Runnable {private static final Logger LOGGER = LoggerFactory.getLogger(MyThread.class);@Overridepublic void run() {LOGGER.info("Called from thread");}
}

然后,我们准备将执行程序注入到我们的服务中,并使用它来执行可运行实例。

package com.gkatzioura.service;import com.gkatzioura.MyThread;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.core.task.TaskExecutor;
import org.springframework.stereotype.Service;import java.util.List;/*** Created by gkatzioura on 4/26/17.*/
@Service
public class AsynchronousService {@Autowiredprivate TaskExecutor taskExecutor;@Autowiredprivate ApplicationContext applicationContext;public void executeAsynchronously() {MyThread myThread = applicationContext.getBean(MyThread.class);taskExecutor.execute(myThread);}}

在下一篇文章中,我们将通过使用spring的异步函数将多重读取的代码库提高到一个新的水平。

您可以在github上找到源代码。

翻译自: https://www.javacodegeeks.com/2017/10/spring-threads-taskexecutor.html

弹簧和线程:TaskExecutor相关推荐

  1. taskexecutor_弹簧和线程:TaskExecutor

    taskexecutor 在Web应用程序中使用线程并不罕见,尤其是当您必须开发长期运行的任务时. 考虑到spring,我们必须格外注意并使用它已经提供的工具,而不是生成我们自己的线程. 我们希望线程 ...

  2. mfc 弹簧_弹簧和线程:异步

    mfc 弹簧 以前,我们开始使用spring和TaskExecutor ,因此我们对如何在spring应用程序中使用线程更加熟悉. 但是,使用任务执行程序可能比较麻烦,尤其是当我们需要执行简单的操作时 ...

  3. mfc 弹簧_弹簧和线程:事务

    mfc 弹簧 为了能够在我们的线程中使用事务,我们需要了解事务如何在spring中工作. spring中的事务信息存储在ThreadLocal变量中. 因此,这些变量特定于单个线程上正在进行的事务. ...

  4. 20.案例实战:为@Async实现一个自定义线程池

    代码:https://github.com/NIGHTFIGHTING/spring_boot_learning/tree/master/19-20/agan-boot/agan-boot-async ...

  5. 《Spring 5 官方文档》18. Web MVC 框架(五)

    自定义WebDataBinder初始化 要通过Spring定制与PropertyEditor的请求参数绑定 WebDataBinder,可以使用@InitBinder控制器中的-annotated @ ...

  6. spring boot中使用@Async失效

    场景:在service中用户新增的方法中调用接口上传数据到其他库的接口,在新增方法上使用了@Transactional,在上传数据方法上使用了@Async,然后发现@Async注解不生效. 解决方案: ...

  7. 帮你梳理springboot所有常用注解

    文章目录 1.springmvc注解 1. @RestController.@ResponseBody.@Controller 2. @RequestMapping.@GetMapping.@Post ...

  8. 阿里巴巴java开发手册学习

    本文对阿里巴巴java开发手册中需要注意的点予以记录 1.编程规约 类名中包含领域模型如DO/BO/DTO/VO时要 全部大写,如UserDTO. 抽象类要以Abstract或Base开头,异常类以E ...

  9. 二、Eureka之server端集群节点发现,数据同步

    一.前言 Eureka服务端封装了一个集群节点管理的类名称为PeerEurekaNodes 通过名称翻译出来为对等的Eureka节点集合,可以看出这个类是对eureka服务端集群节点抽象,下面通过源码 ...

最新文章

  1. mysql 去重con_python 爬虫 实现增量去重和定时爬取实例
  2. 【php】 PHP 支持 9 种原始数据类型
  3. MSSQL数据库统计所有表的记录数
  4. 放弃java转战kotlin,我的心路历程
  5. java未将对象引用设置_未将对象引用到实例怎么解决_常见问题解析,java
  6. 2020亚太杯数学建模_2020 年 APMCM 亚太地区大学生数学建模竞赛
  7. iOS 动画总结----UIView动画
  8. 【Spring 数据访问终篇】Spring + Hibernate + Mysql
  9. 2020蓝桥杯省赛---java---C---3( 跑步训练)
  10. oracle确实表达式,ORACLE正规表达式
  11. linux 内核的链表操作(好文不得不转)
  12. 百度地图3.2教程(2)公交查询
  13. 判定系数推导 — Coefficient of Determination Derivation
  14. WPS Office 2019 发布Linux 个人版
  15. centos 6.8 安装mysql
  16. Cluster-level pseudo-labelling forsource-free cross-domain facial expressionrecognition
  17. 【整理资料】空间信息网络通信协议
  18. RedHat7.4安装
  19. 用cocos2d3.0写一个srpg游戏-srpg介绍
  20. FlyFish 2.0已发布,大屏开发应用更加灵活便捷

热门文章

  1. 在Tomcat配置JNDI数据源的三种方式
  2. java提高篇之详解内部类
  3. 子列表只是原列表的一个视图
  4. 新闻发布项目——接口类(UserDao)
  5. 块元素与行内元素转化(display属性)
  6. 2015蓝桥杯省赛---java---A---1(熊怪吃核桃)
  7. Mybatis中连接池介绍
  8. SparkSQL性能优化
  9. 微信消息提醒与消息数字提示之BadgeView
  10. 第5步 配置pom.xml文件 pom文件好了就是jar包引入好了