ThreadPoolTaskExecutor学习
1. ThreadPoolTaskExecutor学习
1.1. 前言
- 我们知道一般创建线程池,我们都用
ThreadPoolExecutor,但实际上Spring它也对该线程池做了一层封装,他就是ThreadPoolTaskExecutor
1.2. 代码例子
- 它的创建方式也很简单,各个属性直接通过set设置属性值,最后调用
initialize()方法初始化,实际去做的就是初始化ThreadPoolExecutor - 它封装了回调监听方法
ListenableFutureCallback,可以用作异步回调处理
/**
* @author laoliangliang
* @date 2019/10/10 10:10
*/
public class ExecutorDemo {
public static void main(String[] args) throws ExecutionException, InterruptedException {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(1);
executor.setMaxPoolSize(5);
executor.setQueueCapacity(1);
executor.setBeanName("mybean");
executor.setThreadNamePrefix("mytask-");
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy());
executor.initialize();
List<FutureTask<String>> result = new ArrayList<>();
for (int i = 0; i < 5; i++) {
FutureTask<String> futureTask = new FutureTask<>(() -> {
System.out.println("hello world!");
Thread.sleep(200);
return "hello "+Thread.currentThread().getName();
});
executor.submit(futureTask);
result.add(futureTask);
}
for (FutureTask<String> futureTask : result) {
try {
System.out.println(futureTask.get());
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
}
ListenableFuture<?> runnable = executor.submitListenable(() -> {
Thread.sleep(1000);
System.out.println("runnable");
return "runnable result";
});
runnable.addCallback(new ListenableFutureCallback<Object>() {
@Override
public void onFailure(Throwable e) {
e.printStackTrace();
}
@Override
public void onSuccess(Object o) {
System.out.println("success "+o.toString());
}
});
System.out.println(runnable.get());
executor.shutdown();
}
}
结果
[INFO] ThreadPoolTaskExecutor - -Initializing ExecutorService 'mybean'
hello world!
hello world!
hello world!
hello world!
hello mytask-1
hello world!
hello mytask-1
hello mytask-2
hello mytask-3
hello mytask-4
runnable
runnable result
[INFO] ThreadPoolTaskExecutor - -Shutting down ExecutorService 'mybean'
success runnable result
1.3. 总结
- 当使用线程池时,可以考虑直接使用spring封装的线程池,前一篇
@Async注解实现的线程池就是用的它,我觉得这个可能更加直观且功能丰富,特别当你需要异步处理事件的时候
ThreadPoolTaskExecutor学习的更多相关文章
- JAVA线程池学习,ThreadPoolTaskExecutor和ThreadPoolExecutor有何区别?
初学者很容易看错,如果没有看到spring或者JUC源码的人肯定是不太了解的. ThreadPoolTaskExecutor是spring core包中的,而ThreadPoolExecutor是JD ...
- springboot 学习之路 6(定时任务)
目录:[持续更新.....] spring 部分常用注解 spring boot 学习之路1(简单入门) spring boot 学习之路2(注解介绍) spring boot 学习之路3( 集成my ...
- netty04(重点来了、指定某个客户端发信息或者群发)小声嘀咕~~我也是从零开始学得、、、想学习netty的又不知道怎么下手的童鞋们~~
还是和上几篇一样,先给出前面笔记的连接,有没看的可以去看看再来! netty01 . netty02 .netty03 看到这里.你基本上可以使用netty接受信息和根据对应的信息返回信息了 接 ...
- Springboot学习笔记(六)-配置化注入
前言 前面写过一个Springboot学习笔记(一)-线程池的简化及使用,发现有个缺陷,打个比方,我这个线程池写在一个公用服务中,各项参数都定死了,现在有两个服务要调用它,一个服务的线程数通常很多,而 ...
- spring boot 1.x完整学习指南(含各种常见问题servlet、web.xml、maven打包,spring mvc差别及解决方法)
spring boot 入门 关于版本的选择,spring boot 2.0开始依赖于 Spring Framework 5.1.0,而spring 5.x和之前的版本差距比较大,而且应该来说还没有广 ...
- Spring中的ThreadPoolTaskExecutor
在观察线上系统的运行情况下,发现在错误日志中有这类错误信息,org.springframework.core.task.TaskRejectedException,于是便对ThreadPoolTa ...
- Spring中的线程池ThreadPoolTaskExecutor介绍
前言: Java SE 5.0引入了ThreadPoolExecutor.ScheduledThreadPoolExecutor.Spring 2.x借助ConcurrentTaskExecutor和 ...
- netty学习:UDP服务器与Spring整合(2)
上一篇文章中,介绍了netty实现UDP服务器的栗子. 本文将会对UDP服务器与spring boot整合起来,并使用RedisTemplate的操作类访问Redis和使用Spring DATA JP ...
- Dubbo入门到精通学习笔记(八):ActiveMQ的安装与使用(单节点)、Redis的安装与使用(单节点)、FastDFS分布式文件系统的安装与使用(单节点)
文章目录 ActiveMQ的安装与使用(单节点) 安装(单节点) 使用 目录结构 edu-common-parent edu-demo-mqproducer edu-demo-mqconsumer 测 ...
随机推荐
- Android 蓝牙开发(1)
普通蓝牙设备官方文档 Android 平台包含蓝牙网络堆栈支持,凭借此支持,设备能以无线方式与其他蓝牙设备交换数据.应用框架提供了通过 Android Bluetooth API 访问蓝牙功能的途径. ...
- win10安装ubuntu系统出现的一些问题以及解决方案
前言 在win10系统进行安装新的ubuntu环境的时候遇到的一些问题,以及解决方案,供以后参考. 准备 从ubuntu官网下载最近版本的ubuntu系统,Ubuntu最新版本下载地址 操作系统:wi ...
- 030.[转] sql事务特性
sql事务特性简介 pphh发布于2018年10月5日 Sql事务有原子性.一致性.隔离性.持久性四个基本特性,要实现完全的ACID事务,是以牺牲事务的吞吐性能作为代价的.在有些应用场景中,通过分析业 ...
- 配置oracle的ssl连接
配置oracle的ssl连接 网上也没有中文资料,我硬着头皮看官方文档肯完,终于配置成功,下面是我配置步骤 配置安全套接层连接oracle 目录 1. 配置简介 1 2 ...
- ntp服务设置开机自启动失败
设置了ntpd开机自启动,重启服务器ntpd没有自启动 1.需要禁掉chronyd.service: systemctl disable chronyd.service 2.手动启动ntpd: sys ...
- Java jdom解析xml文件带冒号的属性
Java jdom解析xml文件带冒号的属性 转载请标明出处: https://dujinyang.blog.csdn.net/article/details/99644824 本文出自:[奥特曼超人 ...
- JavaScript显式类型转换与隐式类型转换
隐式类型转换 四则运算 判断语句 toString 在 JavaScript 中声明变量不需指定类型,对变量赋值也没有类型检查,同时还允许隐式类型转换. 这些特征说明 JavaScript 属于弱类型 ...
- CodeForces 984C Finite or not?
http://codeforces.com/problemset/problem/984/C Time limit 1000 msMemory limit 262144 kB 题目 You ...
- 文件名工具类 MoFileNameUtil
文件名工具类 MoFileNameUtil MoFileNameUtil public class MoFileNameUtil { //不包含点号 public static String getF ...
- 《阿里B2B技术架构演进详解》----阅读
B2B(Business To Business)是指一个市场的领域的一种,是企业对企业之间的营销关系.先来总结一下阿里B2B共分为三个阶段: 第一阶段,建立信息网站提供信息和营销服务平台,让买家更加 ...