一、使用场景

1、有时候业务上A端和B端做接口传输消息,B端收到消息后做进一步数据处理(持久化或者解析)等耗时的操作,如果是同步操作会造成等待、超时等情况。可以先向A端返回一个收到信息的消息,再多线程异步处理数据,处理完成之后根据业务需求向A端返回处理完成的信息。

二.静态内部类创建单例的好处

1.这个类的实例化是靠静态内部类的常量实例化的,只会加载一次赋值一次,随着静态内部类一起加载。

2.懒汉式、饿汉式有线程安全问题,需要加同步锁才能实现线程安全。才用静态内部类的话是线程安全的,理由同上。

三.自定义线程池的好处

我们都知道Java有4种线程池分别是:

1.newSingleThreadExecutor 单一的线程池

2.newFixedThreadPool 固定大小的线程池

3.newCachedThreadPool 自动扩大的线程池

4.newScheduledThreadPool 支持定时和周期性任务的线程池

但是都不建议使用,因为他们源码层面都是去调用ThreadPoolExecutor类,填充七个参数来执行的,所以更建议直接new一个ThreadPoolExecutor类,通过填充七大参数来实现自定义控制,更加明确线程池的运行规则,规避资源耗尽的风险。

 自定义线程ThreadPoolExecutor七大参数详解

1.corePoolSize:核心线程数

2.maximumPoolSize:线程池能够容纳的最大线程数

3.keepAliveTime:超时等待时间

4.timeUnit:时间单位

5.workqueue:等待进入线程池的任务缓存队列

6.threadFactory:线程执行工厂

7.handler:拒绝策略

其中拒绝策略又分为四种:

1.AbortPolicy:丢弃任务,并抛出异常,阻塞系统正常工作。

2.DiscardPolicy:丢弃无法处理的任务,不处理,不抛异常;允许任务丢失的话,是一种好策略。

3.DiscardOldestPolicy:丢弃队列最前面的任务,重新提交被拒绝的任务(喜新厌旧)

4.CallerRunsPolicy:只要线程池没关闭,直接在调用者线程中运行当前没丢弃的任务。对性能可能有影响

四、使用静态内部类单例模式创建线程池,并测试使用线程池里的线程异步处理消息

1.静态内部类创建线程池

public class SyncDataThreadPool {private static class SingletonHolder {/*使用自定义线程池,7个参数依次代表1、核心线程数2、最大线程数3、超时等待时间4、时间单位5、允许等待的线程数6、执行工厂7、拒绝策略(这里使用拒绝后续线程并抛异常的策略)*/private static ExecutorService threadPool = new ThreadPoolExecutor(5,10,30,TimeUnit.SECONDS,new LinkedBlockingDeque<>(5),Executors.defaultThreadFactory(),new ThreadPoolExecutor.AbortPolicy());}public SyncDataThreadPool() {}public static ExecutorService newInstance() {return SingletonHolder.threadPool;}

2.编写业务代码,使用sleep模拟同步数据或者解析文件等比较耗时的操作

@ApiOperation(value = "测试", notes = "测试")
@PostMapping(value = "/test")
public String test(HttpServletRequest request , HttpServletResponse response) throws IOException {ExecutorService threadPool = SyncDataThreadPool.newInstance();log.info("当前线程池:"+threadPool.toString()+"它的hashcode为:"+threadPool.hashCode());//通过toString和hashCode方法查看是否是同一个实例,保证单例threadPool.execute(new Runnable() {@Overridepublic void run() {log.info("模拟解析文件开始,调用线程池的线程:"+Thread.currentThread().getName());//获取当前线程的名字try {Thread.sleep(10000);//模拟耗时的处理任务} catch (InterruptedException e) {e.printStackTrace();}log.info("模拟解析文件结束,调用线程池的线程:"+Thread.currentThread().getName());//获取当前线程的名字/*** 这里可以写回调A端的接口反馈消息* */}});
    log.info("-------------------返回认证方法了------------------------");return "ok";
}

3.10秒内快速执行2次Controller方法之后的打印信息

可以看到,是同一个线程池(保证单例)里面两个不同的线程(多线程)异步执行了模拟持久化的操作,并且后面打印“返回认证方法了”在执行线程之前返回,实现了使用静态内部类单例模式创建线程池并异步执行的效果。

使用静态内部类单例模式创建自定义线程池相关推荐

  1. java创建自定义线程池,HR的话扎心了

    前言 前段时间从蚂蚁金服二面回来,有些许面试新的给大家分享. 毕业至今两年一直在A金融公司做Java开发,在一个公司时间长了我也想换个环境,于是在网上投了简历,选择公司我的目标很明确还是金融领域,最好 ...

  2. SpringBoot 自定义线程池

    文章目录 一.自定义线程池 1. yml配置 2. 线程池配置属性类 3. 开启异步线程支持 4. 创建自定义线程池配置类 5. service逻辑层 6. controller控制层 7. 效果图 ...

  3. android自定义线程池工具类,妈妈再也不用担心你不会使用线程池了(ThreadUtils)...

    为什么要用线程池 使用线程池管理线程有如下优点:降低资源消耗:通过重复利用已创建的线程降低线程创建和销毁造成的消耗. 提高响应速度:当任务到达时,任务可以不需要等到线程创建就能立即执行. 提高线程的可 ...

  4. Spring Boot使用@Async实现异步调用:自定义线程池

    在之前的Spring Boot基础教程系列中,已经通过<Spring Boot中使用@Async实现异步调用>一文介绍过如何使用 @Async注解来实现异步调用了.但是,对于这些异步执行的 ...

  5. 【Java 并发编程】线程池机制 ( 线程池阻塞队列 | 线程池拒绝策略 | 使用 ThreadPoolExecutor 自定义线程池参数 )

    文章目录 一.线程池阻塞队列 二.拒绝策略 三.使用 ThreadPoolExecutor 自定义线程池参数 一.线程池阻塞队列 线程池阻塞队列是线程池创建的第 555 个参数 : BlockingQ ...

  6. 【Android 异步操作】线程池 ( 线程池使用示例 | 自定义线程池使用流程 | 自定义任务拒绝处理策略 | 完整代码示例 )

    文章目录 一.自定义线程池使用流程 二.自定义任务拒绝处理策略 三.完整代码示例 在博客 [Android 异步操作]线程池 ( 线程池简介 | 线程池初始化方法 | 线程池种类 | AsyncTas ...

  7. 自定义线程池内置线程池的使用 ThreadPoolExecutor和Executorservice 示例与注意事项

    文章目录 线程池介绍 自己设计一个线程池 1.设计ThreadPool类: 2.设计工作队列 3.实现自己设计的线程池 用java的ThreadPoolExecutor自定义线程池 自定义线程池-参数 ...

  8. Android 自定义线程池的实战

    前言:在上一篇文章中我们讲到了AsyncTask的基本使用.AsyncTask的封装.AsyncTask 的串行/并行线程队列.自定义线程池.线程池的快速创建方式. 对线程池不了解的同学可以先看 An ...

  9. Android AsyncTask 深度理解、简单封装、任务队列分析、自定义线程池

    前言:由于最近在做SDK的功能,需要设计线程池.看了很多资料不知道从何开始着手,突然发现了AsyncTask有对线程池的封装,so,就拿它开刀,本文将从AsyncTask的基本用法,到简单的封装,再到 ...

最新文章

  1. 【Docker】Ubuntu18.04国内源安装Docker-准备工作(一)
  2. 中文乱码各个浏览器的处理
  3. centos6安装mysql并远程连接_MySQL5.7数据库安装与远程连接
  4. 孩子数学总是考不好?做好这五点,下次成绩一定好
  5. mysql有dataguard吗_Oracle查看是否搭建DataGuard
  6. 分布式事务最终一致性mysql_分布式事务最终一致性方案案例
  7. 成因:六大元凶让肝不堪重负
  8. java计算机毕业设计springboot+vue基本微信小程序的医疗耗材管理系统 uniapp
  9. python中text的textvriable_python+NLTK 自然语言学习处理五:词典资源
  10. 这五款办公神器一个比一个好用
  11. 孤独星球android app,《孤独星球》终于出了全套免费的旅行指南APP!
  12. 西班牙出差见闻之一(出发)
  13. UNI-APP APP版本更新方法
  14. 手把手教你写Linux I2C设备驱动 tvp5158
  15. 时间服务器端口协议,时间服务器端口
  16. android M权限问题
  17. 服务程序占用服务器内存过大处理
  18. kdj指标主要看哪个值_KDJ指标怎么看?KDJ指标详解
  19. 西安面试第一天面试问题总结
  20. 主成份分析与因子分析的区别

热门文章

  1. 关于org.apache.spark.sql.Row
  2. 微信小程序 获取input 只读value值
  3. 9.8 YY直播 一 、9.17 二
  4. 仿京东的图片放大镜案例
  5. Python反反爬虫 - Frida破解某安卓社区token反爬虫
  6. mysql er图 属性 联系_数据库er图 联系属性
  7. Summary of the January
  8. python-turtle函数
  9. 如何在Excel中插入一行
  10. 测试人员如何运用好OKR