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注解实现的线程池就是用的它,我觉得这个可能更加直观且功能丰富,特别当你需要异步处理事件的时候

最新文章

  1. Elasticsearch 检索
  2. Java 在指定目录建立指定文件名的文件 并输入内容
  3. C# 添加.DLL 出错的解决方法
  4. perl命令批量替换文件内容
  5. 另一个有趣的Captcha 网站
  6. rsyslog 不打印日志到/var/log/messages
  7. Tensorflow 线性回归预测房价实例
  8. Oracle 外键级联更新
  9. Vue中使用Vue.component定义两个全局组件,用单标签应用组件时,只显示一个组件的问题和 $emit的使用。
  10. vertical-align 详解
  11. Python -- Scrapy 框架简单介绍(Scrapy 安装及项目创建)
  12. maven项目中引入Jstl
  13. JSP常用Form表单控件
  14. 跨resetlogs不完全恢复- oracle自动reset错误incarnation
  15. 剑指offer —— 替换空格
  16. Chrome扩展修改页面代码执行环境的方法
  17. ios常见错误之 Failed to instantiate the default view controller for UIMainStoryboardFile &#39;Main&#39; - perhaps the designated entry point is not set?
  18. POJ1780 Code
  19. 将项目上传到Github之使用git命令上传
  20. EL表达式无法被解析

热门文章

  1. MySQL基于报错注入2
  2. IntelliJ IDEA UML插件
  3. Master Note: Troubleshooting ORA-1548 error (Doc ID 1577988.1)
  4. bash 中 小括号的作用
  5. liteos动态加载(十三)
  6. apicloud含有微信支付。支付宝支付和苹果内购的代码
  7. 接口测试中GET和POST两种基本HTTP请求方法的区别
  8. ionic4 ion-picker用法
  9. rss订阅
  10. 2019 SDN阅读作业(2)