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错误,对于界面的显示非常不友好,因此需要做处理. 全局异 ...
随机推荐
- ubuntu 安装Firefox 29.0
下载Firefox 29.0 % cd ~/Downloads % sudo cp firefox-29.0.tar.bz2 /opt % cd /opt % sudo tar -xvjf firef ...
- ios编译ASIHTTPRequest时出现 'libxml/HTMLparser.h' file not found in ASIHTTPRequest
解决方法是添加libxml2.dylib 然后在Build Settings 中的 Header Search Paths 添加: ${SDK_DIR}/usr/include/libxml2
- NOIp 2012 #1 Vigenère 密码 Label:模拟
题目描述 16 世纪法国外交家 Blaise de Vigenère 设计了一种多表密码加密算法――Vigenère 密 码.Vigenère 密码的加密解密算法简单易用,且破译难度比较高,曾在美国南 ...
- 【HDU】1517 A Multiplication Game
http://acm.hdu.edu.cn/showproblem.php?pid=1517 题意:每次乘上2~9..p>=n时赢.. #include <cstdio> #incl ...
- 团队计划backlog
http://www.cnblogs.com/threemonkey/p/5388439.html
- Struts2整理+课堂代码+注意事项
1.在Struts配置文件的<package 中的 namespace默认是namesopace="/". 当生成namespace=“abc/”(abc是自己定义的,类 ...
- bzoj3594: [Scoi2014]方伯伯的玉米田--树状数组优化DP
题目大意:对于一个序列,可以k次选任意一个区间权值+1,求最长不下降子序列最长能为多少 其实我根本没想到可以用DP做 f[i][j]表示前i棵,操作j次,最长子序列长度 p[x][y]表示操作x次后, ...
- Html5 与 Html4 的区别
HTML5是HTML标准的下一个版本.虽然HTML5没有完全颠覆HTML4,但是它们也有一些不同.最新最全的HTML5-HTML4对比信息 请看http://dev.w3.org/html5/html ...
- lua函数
一.函数 在lua中函数的调用方式和C语言基本相同. 如print(“hello world”), z=add(x+y).唯一的差别是,如果函数只有一个参数,并且该参数是字符串或者table构造器 ...
- bind绑定事件,摁回车键提交查询,点击查询也可以提交查询
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...