静态内部类方法构建单例模式创建ThreadPoolExecutor线程池

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了静态内部类方法构建单例模式创建ThreadPoolExecutor线程池相关的知识,希望对你有一定的参考价值。

参考技术A 之前写过一篇 java线程池ThreadPoolExecutor使用无界队列LinkedBlockingQueue实现多线程 简单记录了下ThreadPoolExecutor使用无界队列LinkedBlockingQueue实现多线程的用法。但是在实际应用中,有些并发量大的请求场景,直接如此用会被同时创建多个线程池,会有内存不够用的风险,所以可以考虑用单例模式来管理线程池的调用。

最简单的办法可以是把初始化的ThreadPoolExecutor用@Bean直接注入到springboot中,这样是单例的,不过这样就变成了公用线程池,用完不能shutdown(),会一直存在应用中占用一点内存,当然springboot也自带了线程池可以直接调用,但是因为是公用的所以配置不能根据不同业务灵活改变,所以必要时候还是自己写一个比较好。

对单例模式不太熟的话可以看下面两篇博文,讲的很详细了,一般实现方式有饿汉式、懒汉式、双重检测和静态内部类的方法实现单例,综合使用场景,我觉得静态内部类的方法最适合。
单例模式参考博文链接: https://www.cnblogs.com/jingpeipei/p/5771716.html
https://www.cnblogs.com/damsoft/p/6105122.html

下面就用静态内部类的方法创建一个单例来管理ThreadPoolExecutor的创建:

业务测试方法:

注意,这种自己创建的线程池用完之后要及时关闭,考虑到并发的情况,当线程池存在且没有被关闭时也可以同时处理其他并发的调用,shutdown之后再调用时会重新生成一个新的线程池继续接收处理请求。这样兼顾了占用内存和性能。测试时第一个请求size赋值1000,同时第二个请求size赋值为1,当size为1的请求处理完毕,线程池被关闭之后,第一个请求还没有处理完,剩余的请求会创建一个新的线程池继续处理剩余的请求,处理完之后会关闭线程池,这样用起来不同业务场景可以新建不同配置,比较灵活,用完即关也比较节省内存。

以上是关于静态内部类方法构建单例模式创建ThreadPoolExecutor线程池的主要内容,如果未能解决你的问题,请参考以下文章

单例模式

创建型模式之单例模式

请问java 单例类 与 静态类 有何不同?

设计模式之单例模式20170711

单例模式(懒汉模式-双检锁饿汉模式静态内部类模式)-详细

单例模式(懒汉模式-双检锁饿汉模式静态内部类模式)-详细