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 测 ...
随机推荐
- SparkStreaming整合flume
SparkStreaming整合flume 在实际开发中push会丢数据,因为push是由flume将数据发给程序,程序出错,丢失数据.所以不会使用不做讲解,这里讲解poll,拉去flume的数据,保 ...
- vue中点击按钮复制内容
<el-button type="primary" round size="mini" @click="copyUrl">复制u ...
- ORA-01555 When Max Query Length Is Less Than Undo Retention, small or 0 Seconds (Doc ID 1131474.1)
ORA-01555 When Max Query Length Is Less Than Undo Retention, small or 0 Seconds (Doc ID 1131474.1) A ...
- 用maven运行指定java类main方法
mvn exec:java -Dexec.mainClass="com.java2s.ide.App"
- python3.5.3rc1学习十一:字典与模块
#os模块import oscurDir = os.getcwd()print(curDir) os.mkdir("新建") import timetime.sleep(2)os. ...
- angular6.x 引入echarts
因为angular2+ 使用 ==typescript==开发,所以想要使用echarts,必须安装echarts针对angular的插件ngx-echarts.本文案列实际效果如上图. 安装ngx- ...
- 玩转算法系列--图论精讲 面试升职必备(Java版)
第1章 和bobo老师一起,玩转图论算法欢迎大家来到我的新课程:<玩转图论算法>.在这个课程中,我们将一起完整学习图论领域的经典算法,培养大家的图论建模能力.通过这个课程的学习,你将能够真 ...
- Phoenix |安装配置| 命令行操作| 与hbase的映射| spark对其读写
Phoenix Phoenix是HBase的开源SQL皮肤.可以使用标准JDBC API代替HBase客户端API来创建表,插入数据和查询HBase数据. 1.特点 1) 容易集成:如Spark,Hi ...
- bzoj4520 K远点对
题目链接 思路 这个"\(K\)远"点对一直理解成了距离第\(K\)大的点对\(233\). 要求第\(K\)远,那么我们只要想办法求出来最远的\(K\)个点对就可以了. 用一个大 ...
- Serializers 序列化组件——ModelSerializer详解
前面学习Serializers用法时,发现所有的序列化都与我们的模型紧密相关. django_restframework也给我提供了跟模型紧密相关的序列化器——ModelSerializer. 它会根 ...