关于我们

质量为本、客户为根、勇于拼搏、务实创新

< 返回新闻公共列表

线程池的五种实现方式

发布时间:2020-08-06 10:43:00

其实线程池我更愿意说成四种封装实现方式,一种原始实现方式。这四种封装的实现方式都是依赖于最原始的的实现方式。所以这里我们先介绍四种封装的实现方式

2.1 Executors.newSingleThreadExecutor()

这个线程池很有意思,说是线程池,但是池子里面只有一条线程。如果线程因为异常而停止,会自动新建一个线程补充。
我们可以测试一下:
我们对线程池执行十条打印任务,可以发现它们用的都是同一条线程

    public static void test01() {

        ExecutorService threadPool = Executors.newSingleThreadExecutor();

        try {

            //对线程进行执行十条打印任务

            for(int i = 1; i <= 10; i++){

                threadPool.execute(()->{

                    System.out.println(Thread.currentThread().getName()+"=>执行完毕!");

                });

            }

        } catch (Exception e) {

            e.printStackTrace();

        } finally {

            //用完线程池一定要记得关闭

            threadPool.shutdown();

        }

    }

pool-1-thread-1=>执行完毕!

pool-1-thread-1=>执行完毕!

pool-1-thread-1=>执行完毕!

pool-1-thread-1=>执行完毕!

pool-1-thread-1=>执行完毕!

pool-1-thread-1=>执行完毕!

pool-1-thread-1=>执行完毕!

pool-1-thread-1=>执行完毕!

pool-1-thread-1=>执行完毕!

2.2 Executors.newFixedThreadPool(指定线程数量)

这个线程池是可以指定我们的线程池大小的,可以针对我们具体的业务和情况来分配大小。它是创建一个核心线程数跟最大线程数相同的线程池,因此池中的线程数量既不会增加也不会变少,如果有空闲线程任务就会被执行,如果没有就放入任务队列,等待空闲线程。
我们同样来测试一下:

    public static void test02() {

        ExecutorService threadPool = Executors.newFixedThreadPool(5);

        try {

            //对线程进行执行十条打印任务

            for(int i = 1; i <= 10; i++){

                threadPool.execute(()->{

                    System.out.println(Thread.currentThread().getName()+"=>执行完毕!");

                });

            }

        } catch (Exception e) {

            e.printStackTrace();

        } finally {

            //用完线程池一定要记得关闭

            threadPool.shutdown();

        }

    }

我们创建了五条线程的线程池,在打印任务的时候,可以发现线程都有进行工作

pool-1-thread-1=>执行完毕!

pool-1-thread-1=>执行完毕!

pool-1-thread-1=>执行完毕!

pool-1-thread-1=>执行完毕!

pool-1-thread-1=>执行完毕!

pool-1-thread-1=>执行完毕!

pool-1-thread-2=>执行完毕!

pool-1-thread-3=>执行完毕!

pool-1-thread-5=>执行完毕!

pool-1-thread-4=>执行完毕!

2.3 Executors.newCachedThreadPool()

这个线程池是创建一个核心线程数为0,最大线程为Inter.MAX_VALUE的线程池,也就是说没有限制,线程池中的线程数量不确定,但如果有空闲线程可以复用,则优先使用,如果没有空闲线程,则创建新线程处理任务,处理完放入线程池。
2.4 Executors.newScheduledThreadPool(指定最大线程数量)

创建一个没有最大线程数限制的可以定时执行线程池
在这里,还有创建一个只有单个线程的可以定时执行线程池(Executors.newSingleThreadScheduledExecutor())这些都是上面的线程池扩展开来了,不详细介绍了。



相关阅读

云计算的三个优点选取小程序服务商时的注意事项不同数据库的不同区别什么是VPS主机它的优势是什么?你知道5G的优点和缺点吗?云南三级分销商城开发的目的和对企业的价值云南网站优化的3个方面和网页的优化我们晋级拉!!!云南网站链接维护的具体方法云南网站应该如何做优化云南网站维护的主要内容云南云服务器和虚拟主机的操作区别云服务器部署和注意点云南服务网器托管应该选择怎样的机房云南虚拟建设网站主机的优点和缺点云服务器和物理服务器的区别云服务器有哪些优势C# List用法 List介绍C#和Java有什么不同PHP的优点和缺点智慧新餐饮和传统餐饮的区别云数据库对比传统数据库有哪些优点裸金属服务器是什么它的作用是什么白盒测试的特点js中添加scriptjs中[]、{}、()的用法和区别php 字符串的整型转换ipa如何安装到苹果手机邓白氏码是什么?iOS开发者账号到期续费教程在C#中有哪些引用类型和值类型小程序搭建时需要准备些什么云数据库对比传统数据库的优势什么样的企业适合SEMjs中的常见错误C#数据类型转换字符串与数值之间的转换C#的几种循环遍历方式物联网是什么它和互联网又有什么区别?云南网站建设时应该注意些什么云计算是什么?它能干些什么?展望未来5G会给我们的生活带来哪些影响C#常见的几种报错类别C#的学习流程有哪些dedecms 绑定二级域名的正确方法SEM是什么它和SEO之间是什么关系?云南新餐饮料模式是如何运行的?云南网站建设初期应该注意哪些问题云南网站建设中原创文章对网站起什么作用Javascript中如何中断forEach循环云南零售小程序前景怎么样?如何优化WEB应用数据库访问慢的问题?Javascript中用let和var声明变量的区别是什么redis 的主从复制和哨兵?递归和迭代有何区别?<input> 标签的 readonly 属性怎么用?云南网站建设中网页版商城如何保证网站安全云南企业官网如何推广云南企业网站建设为什么把文章类型的栏目排在前面云南餐饮小程序能带给餐饮业什么?云南网站建设需要注意什么地方云南云服务器配置如何选择合适的云南网站建设和网站设计有何区别?云南网站建设—企业官网的好处在哪?云南做小程序的优势在哪?为什么建议做小程序?网站为什么要配置ssl证书?网站为什么要做seo,做seo有什么好处?微信小程序_企业付款到零钱 API 开发如何利用缓存提高asp.net网站访问速度中小型企业如何选择服务器配置?如何优化中小型企业网站C#.net做网站后台 需要记录日志基于asp.net企业门户网站设计霓裳民族服装seo优化分析建议Javascript的函数封装认识及使用Ajax请求中data与后端的交互有哪几种方法JavaScript如何实现组合模式???SQL之子查询的基本用法有哪些?什么是静态测试、动态测试、黑盒测试、白盒测试、α测试 β测试?C# 引入委托的目的是什么c# 委托的本质是什么C# DataGridView添加新行的2个方法C#支付宝扫码支付代码完整版c# MVC 微信支付教程系列之扫码支付代码实例Redis基础通用操作指令有哪些?String、StringBuffer和StringBuilder的各自用法常见的一些Dos命令有哪些?如何在C#中复制一个Windows窗体类前端js中的运算符的种类,=、==与===的有何区别?网站前端怎么设置页面禁止转载?解决XSS脚本攻击恶意代码的方法你知道?javascript 之 apply()、call() 探索net core实现跨域ASP.NET Core程序部署到LinuxASP.NET Core使用AutoMapper.NET Core:处理全局异常.NET Core在ASP.NET Core WebApi中使用CookieASP.NET Core:ASP.NET Core中使用NLog记录日志如何重启iis服务器SQL Server代理服务无法启动怎么办js 判断手机版与PC版自适应跳转升级版 PC版手机版界面对应跳转
/template/Home/Zkeys/PC/Static