Spring task executor同异步
1. spring提供了哪些任务执行器,是否有同步的任务执行器
有ThreadPoolTaskExecutor等执行器
同步可以用SyncTaskExecutor,但这个可以说不算一个线程池,因为还在原线程执行
也可以用ThreadPoolTaskExecutor结合FutureTask做到同步
此外还有

代码:
/*
* 文 件 名: Test000101.java
* 版 权: . Copyright 2008-2015, All rights reserved Information Technology Co.,Ltd.
* 描 述: <描述>
* 修 改 人: chen.simon
* 修改时间: 2016-5-11
*/
package org.simonme.mt.demo; import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask; import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.core.task.TaskExecutor; /**
* <一句话功能简述> <功能详细描述>
*
* @author Chenxiaguang
* @version [版本号, 2016-5-11]
* @see [相关类/方法]
* @since [产品/模块版本]
*/
public class Test000101
{ public static void main(String[] args)
{
execute(provideThreadPoolTaskExecutor());
execute(provideSyncTaskExecutor());
} /** <一句话功能简述>
* <功能详细描述>
* @see [类、类#方法、类#成员]
*/
private static void execute(TaskExecutor taskESExecutor)
{
System.out.println(taskESExecutor);
Callable<String> run = new Callable<String>()
{
public String call()
{
return runTask();
}
}; FutureTask<String> task = new FutureTask<String>(run);
taskESExecutor.execute(task);
System.out.println("Before get"); /**
* 下面的get 利用了FutureTask的阻塞特性,使得主线程等待 TaskExecutor异步执行完后拿到结果<br/>
* 此处虽说用的是异步的TaskExecutor,但是拿结果的动作还是同步的<br/>
*/
try
{
task.get();
}
catch (InterruptedException e)
{
e.printStackTrace();
}
catch (ExecutionException e)
{
e.printStackTrace();
}
System.out.println("After get");
} public static TaskExecutor provideThreadPoolTaskExecutor()
{
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext-0001.xml");
TaskExecutor taskESExecutor000101 = (TaskExecutor)applicationContext.getBean("taskESExecutor000101");
return taskESExecutor000101;
} public static TaskExecutor provideSyncTaskExecutor()
{
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext-0001.xml");
TaskExecutor taskESExecutor000102 = (TaskExecutor)applicationContext.getBean("taskESExecutor000102");
return taskESExecutor000102;
} private static String runTask()
{
try
{
Thread.sleep(2 * 1000l);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
String result = "Finish";
System.out.println(result);
return result;
} }
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"
default-autowire="byName" default-lazy-init="false"> <bean id="taskESExecutor000101" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
<property name="corePoolSize" value="10" />
<property name="maxPoolSize" value="50" />
<property name="queueCapacity" value="500" />
<property name="keepAliveSeconds" value="300" />
<property name="rejectedExecutionHandler">
<bean class="java.util.concurrent.ThreadPoolExecutor$DiscardOldestPolicy" />
</property>
</bean> <bean id="taskESExecutor000102" class="org.springframework.core.task.SyncTaskExecutor">
</bean> </beans>
2. SyncTaskExecutor与ThreadPoolTaskExecutor区别
前者是同步执行器,执行任务同步,见下图,还在主线程上
后者是线程池,执行任务异步,见下图,在另外的线程上
ThreadPoolTaskExecutor执行的堆栈图:

SyncTaskExecutor执行的堆栈图:

此外线程池这种任务执行器在任务执行完主线程不会退出。
Spring task executor同异步的更多相关文章
- Spring的任务调度@Scheduled注解——task:scheduler和task:executor的解析
原文地址: https://blog.csdn.net/yx0628/article/details/80873774 一个简单的Spring定时任务的 demo,全部代码见下载地址:https:// ...
- Spring源码情操陶冶#task:executor解析器
承接Spring源码情操陶冶-自定义节点的解析.线程池是jdk的一个很重要的概念,在很多的场景都会应用到,多用于处理多任务的并发处理,此处借由spring整合jdk的cocurrent包的方式来进行深 ...
- Spring 使用介绍(十二)—— Spring Task
一.概述 1.jdk的线程池和任务调用器分别由ExecutorService.ScheduledExecutorService定义,继承关系如下: ThreadPoolExecutor:Executo ...
- 任务调度 Spring Task 4(一)
深入浅出spring task定时任务 在工作中有用到spring task作为定时任务的处理,spring通过接口TaskExecutor和TaskScheduler这两个接口的方式为异步定时任务提 ...
- spring task 配置
Spring对Quartz作了一个封装,同时,Spring自己也提供了一个任务定时器(spring-task),现把它总结一下. 对于Quartz,我们使用的时候主要是注重两个方面,一个是定时任 ...
- Quartz Spring与Spring Task总结
Spring对Quartz作了一个封装,同时,Spring自己也提供了一个任务定时器(spring-task),现把它总结一下. 对于Quartz,我们使用的时候主要是注重两个方面,一个是定时任 ...
- spring定时任务轮询(spring Task)
定时任务轮询比如任务自服务器启动就开始运行,并且每隔5秒执行一次. 以下用spring注解配置定时任务.1.添加相应的schema xmlns:task=" xsi:schemaLocati ...
- uartz Spring与Spring Task总结
Spring对Quartz作了一个封装,同时,Spring自己也提供了一个任务定时器(spring-task),现把它总结一下. 对于Quartz,我们使用的时候主要是注重两个方面,一个是定时任 ...
- SpringBoot整合全局异常处理&SpringBoot整合定时任务Task&SpringBoot整合异步任务
============整合全局异常=========== 1.整合web访问的全局异常 如果不做全局异常处理直接访问如果报错,页面会报错500错误,对于界面的显示非常不友好,因此需要做处理. 全局异 ...
随机推荐
- Codeforce - Travelling Salesman
After leaving Yemen, Bahosain now works as a salesman in Jordan. He spends most of his time travelli ...
- 『备忘』HttpWebRequest 在 POST 提交时, 标头(Headers)丢失原因
近来研究 HttpWebRequest —— 辅助类完成时,POST JSON数据 总会 丢失标头(Headers). HttpWebRequest POST JSON数据,分如下几步: > 将 ...
- 【BZOJ】1106: [POI2007]立方体大作战tet
题意 给定一个长度为\(2n(1 \le n \le 500000)\)的序列,\(1\)~\(n\)各出现两次,可以交换相邻两项,两个同样的数放在一起会对消,求把所有数对消的最小交换次数. 分析 如 ...
- 简单打包 ipa 方式!
应用的发布也分两种 一种是.打包成ipa上传到国内第3方软件市场,当用户的手机已经JailBreak时,双击下载的ipa文件就可以安装软件 (ipa同android的apk包一样,实质是一个压缩包) ...
- Eclipse 使用maven创建Dynamic Web Project
今天看到spring的官网首页已经没有下载连接了,建议使用maven构建spring项目.虽然maven已经不是新技术,但是这个我还没用过,谷歌走起! 通常创建项目都是用Eclipse,前几年还是My ...
- OSG 自定义数据类型 关键帧动画
OSG 自定义数据类型 关键帧动画 转自:http://blog.csdn.net/zhuyingqingfen/article/details/12651017 /* 1.创建一个AnimManag ...
- 简短总结一下C#里跨线程更新UI(转)
摘自: http://my.oschina.net/sdqxcxh/blog/53707 跨线程更新UI是写多线程程序尤其是通信类的程序经常遇到的问题,这里面主要的问题是冲突,比如数据线程想要更新UI ...
- 深入C#判断操作系统类型的总结详解(转载)
Windows操作系统的版本号一览 操作系统 PlatformID 主版本号 副版本号 Windows95 1 4 0 Windows98 1 4 10 WindowsMe ...
- (转)C#特性学习与使用(为枚举定义Description)
参考:http://blog.csdn.net/nndtdx/article/details/6905802#comments
- 【Go语言】学习资料
这段时间一直在看Go语言,6月3日Apple发布了swift发现里面竟然也有许多Go语言的影子,截至现在每天都在感觉到Go语言的强大.确实值得一学 今天在这里给园友们推荐一些Go语言的学习资料 网站 ...