一 TaskExecutor接口

Spring的TaskExecutor接口等同于Java.util.concurrent.Executor接口。 实际上,它存在的主要原因是为了在使用线程池的时候,将对Java 5的依赖抽象出来。 这个接口只有一个方法execute(Runnable task),它根据线程池的语义和配置,来接受一个执行任务。

最初创建TaskExecutor是为了在需要时给其他Spring组件提供一个线程池的抽象。 例如ApplicationEventMulticaster组件、JMS的AbstractMessageListenerContainer和对Quartz的整合都使用了TaskExecutor抽象来提供线程池。 当然,如果你的bean需要线程池行为,你也可以使用这个抽象层。

二 TaskExecutor类型

在Spring发行包中预定义了一些TaskExecutor实现。有了它们,你甚至不需要再自行实现了。

SimpleAsyncTaskExecutor 类

这个实现不重用任何线程,或者说它每次调用都启动一个新线程。但是,它还是支持对并发总数设限,当超过线程并发总数限制时,阻塞新的调用,直到有位置被释放。如果你需要真正的池,请继续往下看。

SyncTaskExecutor类

这个实现不会异步执行。相反,每次调用都在发起调用的线程中执行。它的主要用处是在不需要多线程的时候,比如简单的test case。

ConcurrentTaskExecutor 类

这个实现是对Java 5 java.util.concurrent.Executor类的包装。有另一个备选, ThreadPoolTaskExecutor类,它暴露了Executor的配置参数作为bean属性。很少需要使用ConcurrentTaskExecutor, 但是如果ThreadPoolTaskExecutor不敷所需,ConcurrentTaskExecutor是另外一个备选。

SimpleThreadPoolTaskExecutor 类

这个实现实际上是Quartz的SimpleThreadPool类的子类,它会监听Spring的生命周期回调。当你有线程池,需要在Quartz和非Quartz组件中共用时,这是它的典型用处。

ThreadPoolTaskExecutor 类

它不支持任何对java.util.concurrent包的替换或者下行移植。Doug Lea和Dawid Kurzyniec对java.util.concurrent的实现都采用了不同的包结构,导致它们无法正确运行。

这个实现只能在Java 5环境中使用,但是却是这个环境中最常用的。它暴露的bean properties可以用来配置一个java.util.concurrent.ThreadPoolExecutor,把它包装到一个TaskExecutor中。如果你需要更加先进的类,比如ScheduledThreadPoolExecutor,我们建议你使用ConcurrentTaskExecutor来替代。

TimerTaskExecutor类

这个实现使用一个TimerTask作为其背后的实现。它和SyncTaskExecutor的不同在于,方法调用是在一个独立的线程中进行的,虽然在那个线程中是同步的。

WorkManagerTaskExecutor类

CommonJ 是BEA和IBM联合开发的一套规范。这些规范并非java ee的标准,但它是BEA和IBM的应用服务器实现的共同标准

这个实现使用了CommonJ WorkManager作为其底层实现,是在Spring context中配置CommonJ WorkManager应用的最重要的类。和SimpleThreadPoolTaskExecutor类似,这个类实现了WorkManager接口,因此可以直接作为WorkManager使用。

三 TaskExcutor简单实例

1 taskExcutor

packagecom.test;importorg.springframework.core.task.TaskExecutor;public classMainExecutor {privateTaskExecutor taskExecutor;publicMainExecutor (TaskExecutor taskExecutor) {this.taskExecutor =taskExecutor;

}public voidprintMessages() {for(int i = 0; i < 25; i++) {

taskExecutor.execute(new MessagePrinterTask("Message" +i));

}

}private class MessagePrinterTask implementsRunnable {privateString message;publicMessagePrinterTask(String message) {this.message =message;

}public voidrun() {

System.out.println(message);

}

}

}

View Code

2 main

packagecom.test;importorg.springframework.context.ApplicationContext;importorg.springframework.context.support.ClassPathXmlApplicationContext;public classTaskTest {//本地测试,不用部署到tomcat

public static voidmain(String[] args) {

System.out.println("测试任务调度开始...");

ApplicationContext appContext= new ClassPathXmlApplicationContext("applicationContext.xml");

MainExecutor te= (MainExecutor)appContext.getBean("taskExecutorExample");

te.printMessages();

System.out.println("--------");

}

}

View Code

3.applicationContext.xml配置

View Code

java executor spring_Spring+TaskExecutor实例相关推荐

  1. Java并发编程最佳实例详解系列

    Java并发编程最佳实例详解系列: Java并发编程(一)线程定义.状态和属性 Java并发编程(一)线程定义.状态和属性 线程是指程序在执行过程中,能够执行程序代码的一个执行单元.在java语言中, ...

  2. Java Executor源码解析(7)—Executors线程池工厂以及四大内置线程池

    详细介绍了Executors线程池工具类的使用,以及四大内置线程池. 系列文章: Java Executor源码解析(1)-Executor执行框架的概述 Java Executor源码解析(2)-T ...

  3. java中删除sqlite数据库语句_sqlite数据库的介绍与java操作sqlite的实例讲解

    sqlite数据库的介绍与java操作sqlite的实例讲解 发布时间:2020-10-03 05:40:34 来源:脚本之家 阅读:92 作者:Lee_Tech sqlite是啥? 1.一种轻型数据 ...

  4. tcp网络通信教程 java_基于java TCP网络通信的实例详解

    JAVA中设计网络编程模式的主要有TCP和UDP两种,TCP是属于即时通信,UDP是通过数据包来进行通信,UDP当中就会牵扯到数据的解析和传送.在安全性能方面,TCP要略胜一筹,通信过程中不容易出现数 ...

  5. java 调用window程序_Windows下Java调用可执行文件代码实例

    这篇文章主要介绍了Windows下Java调用可执行文件代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 缘起: 由于没有找到java转换文件 ...

  6. java中this是实例吗_java中this用法实例

    java中this用法实例,java this关键字的使用.this关键字,关于它的解释,可以概括为:哪一个对象在用这段代码,this就代表谁. 例如,"人"这个类,张三说,&qu ...

  7. java多对多关系实例_【Java一对多关系实例公布,你的Java真的可以玩的这么好吗】- 环球网校...

    [摘要]作为一门面向对象编程语言,Java吸收了C++语言的优点,也展现了其强大的一面,我们能在各个地方看到其功能强大和简单易用的两个特征,当然,也吸引了很多程序员的注意力,所以就有人想了解Java的 ...

  8. java 代码压缩javascript_通过Java压缩JavaScript代码实例分享

    通过移除空行和注释来压缩 javascript 代码 /** * this file is part of the echo web application framework (hereinafte ...

  9. java 获取js元素,表单元素值获取方式js及java方式的简单实例

    表单元素值获取方式js及java方式的简单实例 这里有新鲜出炉的 Javascript 教程,程序狗速度看过来! JavaScript 客户端脚本语言 Javascript 是一种由 Netscape ...

最新文章

  1. 如何从0-1构建自己的”pytorch“(自己专属的深度学习框架)——part01
  2. 创建oracle数据库有哪些方法,oracle11g创建数据库的方法-Oracle
  3. java程序连接kafka_Java的Kafka:构建安全,可扩展的消息传递应用程序
  4. deepin下载python_深度操作系统中怎样下载python?
  5. 计划任务 at,cron
  6. hdu1141 Factstone Benchmark(利用对数进行大数比较)
  7. 熊猫烧香C语言源代码,熊猫烧香病毒是不是用C语言编的
  8. python Excel xlsx file; not supported
  9. buu(前三页第二弹) RSA习题与相关知识总结
  10. VSCode添加背景图片
  11. aps是什么意思_aps画幅是什么意思
  12. php移动插屏如何做,每天说移动营销,你懂插屏广告吗?
  13. 小米路由器4刷padavan固件
  14. 歌手祁隆离婚再起波澜,与和合国际收购《借我星光》版权有关系吗
  15. XenApp 7.6:如何启用客户端IME,启用客户端输入法
  16. plc热电偶模块模拟量数据波动原因
  17. 1102 Invert a Binary Tree (25point(s))
  18. 浪潮英信服务器 SA5212M4 用户手册 V1.0
  19. 【IT圈是个什么玩意儿】 目录索引
  20. JavaScript与.NET应用程序交互_实验1

热门文章

  1. Linux系统调用过程分析
  2. MySQL与PostgreSQL:该选择哪个开源数据库?哪一个更好?
  3. linux 提供多用户telnet,linux系统telnet命令怎么用
  4. EndNote使用技巧之一--参考文献的导入
  5. java记录登陆时间_Spring security如何实现记录用户登录时间功能
  6. 牛客网-数据结构笔试题目(一)-猫咪特征提取思路解析(附源码)
  7. 大数相加c语言思路,大数相加
  8. matlab radsimp,[转载]MATLAB学习笔记(八)
  9. laravel 控制器中使用中间件_在 Laravel 中使用 Slack 进行异常通知
  10. 在计算机硬件中mo是指,计算机导论 - [课件]第2章 计算机系统的硬件.ppt