线程池的使用

线程池的作用

  1. 降低线程创建和销毁的开销:线程的创建和销毁是比较昂贵的操作。通过使用线程池,可以避免频繁地创建和销毁线程,而是复用线程池中已经存在的线程,从而降低了开销。

  2. 控制并发度:通过控制线程池中线程的数量,可以控制程序的并发度。这样可以避免过多的线程竞争和资源的浪费,提高程序的稳定性和性能。

  3. 提供线程的管理和监控:线程池可以方便地管理和监控线程的状态和执行情况。可以通过线程池的接口来获取线程的执行结果、取消任务、设置优先级等。

  4. 提供任务队列:线程池通常会有一个任务队列,用于保存待处理的任务。当线程池中的线程空闲时,可以从任务队列中取出任务进行处理,避免任务的丢失和过载。

  5. 控制资源消耗:由于线程池可以限制线程的数量,可以有效地控制系统资源的消耗,避免因过多的线程而导致系统崩溃或资源耗尽的问题。

了解了线程池的作用后,来了解一下线程吃的创建吧!

在java标准库中,提供了线程的线程池,可以直接使用.

工厂模式

1.上面这种操作,使用了Executors类的静态方法直接构造出一个对象,(相当于把new 操作隐藏  到方法里面了 ),像这样的方法叫做工厂方法,提供了工厂方法的类叫做工厂类.

2. 在构造方法中,如果方法名相同,参数的个数或者类型不同,就会发生重载,而重载是有一定局限性的,有的构造方法可能就会出现两个方法参数的个数和类型是相同的情况,在这种情下重载是无法实现的,为了解决这种问题,就可以使用工厂模式,所谓工厂模式,就是使用普通的方法来代替构造方法来创建对象

        在上面我们已经创建了一个带有10个线程的线程池,在线程中有一个submit方法,可以给线程池提交若干个任务

运行结果

1. 通过运行结果发现,main线程已经结束,而整个进程还没有结束,是因为线程池中的线程都是 "前台线程",此时会阻止进程的结束. 

2. 当使用submit方法给线程池分配任务的时候,线程池中的线程都是随机执行的.


变量捕获

上面的代码我们换种写法编译器会提示我们有错误

为什么不能直接使用 i 呢?

        上面的run方法属于Runnable(),但这个方法的执行时机不是立刻执行,而是在未来的某个节点上执行,但随着主线程的执行,可能for循环走完了但run方法在线程池中还没有开始执行,此时i就要被销毁了,为了避免作用域的差异,导致后面执行run时i已经被销毁,就有了变量捕获,也就是让run方法把刚才的i在栈上拷贝一份...后面在执行到的时候直接赋值就可以.


线程池的创建方法

上面的的这些线程池,本质上都是包装ThreadPoolExecutor来实现的.

        在java标准库中,给ThreadPoolExecutor提供了四个构造方法,在这四个构造方法都很类似,但最后一个更为复杂,接下来看看第四个构造方法里每个参数代表的含义.

 

而我们在实际开发中线程池中的线程数设置为多少合适呢?此时要考虑两个极端情况 

        1. cpu密集型, 每个线程要执行的任务都是狂转cpu(进行一系列算数运算),此时线程池的线程数最也不要超过cpu的核数,因为cpu密集型任务,要一直占用cpu,线程多,但cpu已经不够分了

        2. IO密集型.每个IO干的工作就是等待IO,比如读写硬盘,读写网卡,等待用户输入等操作,此时这些线程处于阻塞状态,不参与cpu调度,不在受制于CPU核数了.

        然而在实际开发中,没有完全符合这两中理想模型的,具体程序中,有的程序吃cpu,有的程序是等待IO的,要设置多少线程数量是不确定的,要是消耗cpu多,等待IO少,线程数目就可以少设置一点,要是消耗cpu少,等待IO多,则可以多设置一点线程数量.在平常中我们可以进行测试来看看不同线程数量占用系统资源的情况.

        线程池中使用的是阻塞队列,每个线程都是在不停尝试take的,如果有任务就take成功,否则就进行阻塞等待. 

        所谓拒绝策略,也是一个特殊的对象,描述了当线程池的任务队列满了,如果继续天剑任务会有什么样的行为.Java标准库提供了四种拒绝策略.

接下来模拟实现一个简单的固定线程数量的线程池

一个线程池至少有两部分,一个是阻塞队列用来保存任务,另外就是有若干个线程来执行任务.

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;

class MyThreadPool {
    private BlockingQueue<Runnable> queue = new LinkedBlockingQueue<>();
    //创建线程
    //n表示线程数量
    public MyThreadPool(int n) {
        for (int i = 0; i < n; i++) {
            Thread t = new Thread(() -> {
                while(true) {
                    try {
                        Runnable runnable = queue.take();
                        runnable.run();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            });
            t.start();
        }
    }

    //注册任务给线程池
    public void submit(Runnable runnable) {
        try {
            queue.put(runnable);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/144599.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

(个人实测保熟)记录Tecnomatix Process Simulate 16.1.2官方安装包及授权许可配置教程(Win10环境)

Tecnomatix Process Simulate 16是一款由西门子公司推出的一款工艺仿真解决方案,是虚拟制造仿真领域的领先解决方案,可帮助您数字化制造以及将创新思想和原材料转变为变革性产品的过程。在网上找了一些盗版的安装包&#xff0c;就很离谱。直接提示本"无法打开此安装程序包…

spring-cloud-alibaba-nacos

spring cloud nacos 安装和启动nacos # 解压nacos安装包 # tar -zvxf nacos-server-1.4.1.tar.gz# nacos默认是以集群的模式启动&#xff0c;此处先用单机模式 # cd /usr/local/mysoft/nacos/bin # sh startup.sh -m standalone# nacos 日志 # tail -f /usr/local/mysoft/na…

智慧隧道:TSINGSEE青犀远程视频AI智能监管平台保障隧道施工安全

一、背景与需求分析 随着我国交通运输量的增加以及新基建的不断规划和建设&#xff0c;公路建设工作也在持续开展中。高速公路隧道属于特殊构造段&#xff0c;因为隧道空间小&#xff0c;密闭性强&#xff0c;施工过程中一旦发生火灾、事故等&#xff0c;将带来重大人员伤亡和…

身份证照片怎么弄成200k以内?超级好用!

一些网站为了限制大的文件上传&#xff0c;提出了一些大小限制的要求&#xff0c;那么身份证如何弄成200k呢&#xff1f;下面介绍三种方法。 方法一&#xff1a; 使用嗨格式压缩大师 1、在电脑上打开安装好的软件&#xff0c;在首界面中点击“图片压缩”。 2、进入后上传需要…

Vue CLI脚手架安装、搭建、配置 和 CLI项目分析

目录 一、CLI快速入门 1. 官方介绍 : 2.安装Vue CLI : 3.搭建Vue CLI : 4.IDEA配置Vue CLI : 二、Vue CLI项目分析 1.结构分析 : 1.1 config 1.2 node_modules 1.3 src 1.4 static 2.流程分析 : 2.1 main.js 2.2 router/index.js 2.3 components/HelloWorld.vue 2.4 A…

“糖尿病日”感言

长期旺盛的写作欲&#xff0c;今天忽地就莫名其妙地衰退下来了。感到浑身都不舒服&#xff0c;特别是过去从未出现过的腰微痛、乏力现象发生了。 转念一想&#xff0c;或是老龄人一日不如一日的正常反应吧&#xff1f;而且&#xff0c;今天恰逢“ 联合国糖尿病日”&#xff0c…

mysql之MHA

1、定义 全称是masterhigh avaliabulity。基于主库的高可用环境下可以实现主从复制及故障切换&#xff08;基于主从复制才能故障切换&#xff09; MHA最少要求一主两从&#xff0c;半同步复制模式 2、作用 解决mysql的单点故障问题。一旦主库崩溃&#xff0c;MHA可以在0-30…

Spark读取excel文件

文章目录 一、excel数据源转成csv二、Spark读取csv文件(一)启动spark-shell(二)读取csv生成df(三)查看df内容一、excel数据源转成csv 集群bigdata - ubuntu: 192.168.191.19master(bigdata1) - centos: 192.168.23.78 slave1(bigdata2) - centos: 192.168.23.79 slave2(b…

多商家签到打卡奖励免单霸王餐小程序开发

多商家签到打卡奖励免单霸王餐小程序开发 用户注册和登录&#xff1a;提供用户注册和登录功能&#xff0c;以便用户能够参与签到打卡活动。 商家入驻&#xff1a;商家可申请入驻平台&#xff0c;提交相关资料并等待平台审核&#xff0c;审核通过后即可发布活动和奖励。 签到打…

组件库篇 | EUI | 补充知识

组件库篇 | EUI | 补充知识 编码 项目中请务必使用Unicode编码,否则会出现中文乱码问题。 设置方法:使用VS打开项目,项目-属性-高级-字符集-Unicode编码。 数据类型 C语言中的常用数据类型不作讲解,主要讲解一些C语言初学者不熟悉的类型。这些类型大都只需要你传参,因此…

风景照片不够清晰锐利,四招帮你轻松解决

我们大家在拍摄风景照的时候都希望能够拍摄出清晰锐利的照片。可能会有人问&#xff1a;“什么是锐利&#xff1f;”我们可以从锐度来给大家简单解说下。锐度是反映图片平面清晰度和图像边缘对比度的一个参数。锐度较高的画面&#xff0c;微小的细节部分也会表现得很清晰&#…

SQL基础理论篇(二):什么是DBMS / DB / DBS

文章目录 简介DB、DBS和DBMS的区别当前的主流DBMSSQL与NoSQL主流的RDBMS参考文献 简介 日常工作中&#xff0c;我们通常是跟DBMS这些数据库管理软件打交道&#xff0c;而SQL只是它们的通用语言而已。 DB、DBS和DBMS的区别 DBMS&#xff0c;全称是DataBase Management System…

外汇天眼:如何摆脱交易困境?这个比赛告诉你答案!

在现今的金融市场中&#xff0c;外汇交易因其高杠杆、24小时交易等特点吸引着众多投资者。然而&#xff0c;外汇交易并非易事&#xff0c;它需要精准的分析、及时的决策和良好的风险管理。许多新手投资者在涉足外汇市场时都会遇到各种困境&#xff0c;譬如缺乏实践经验、心理压…

流量分析(信息安全铁人三项赛分区赛2-5.18)

题目描述 目录 题目描述 黑客的IP是多少 服务器1.99的web服务器使用的CMS及其版本号(请直接复制) 服务器拿到的webshell的网址(请输入url解码后的网址) 服务器1.99的主机名 网站根目录的绝对路径(注意最后加斜杠) 黑客上传的第一个文件名称是什么 黑客进行内网扫描&am…

【文章学习系列之模型】DAGMM

本章内容 文章概况模型结构损失函数实验结果实验分析总结 文章概况 《Deep Autoencoding Gaussian Mixture Model for Unsupervised Anomaly Detection》是2018年发表于ICLR的一篇论文&#xff0c;该论文提出一种端到端的无监督异常检测方法DAGMM&#xff0c;取得了不错的效果…

Sentinel底层原理(下)

1、概述 Sentinel的核心原理&#xff0c;也就是前面提到暗流涌动的SphU.entry(…)这行代码背后的逻辑。 Sentinel会为每个资源创建一个处理链条&#xff0c;就是一个责任链&#xff0c;第一次访问这个资源的时候创建&#xff0c;之后就一直复用&#xff0c;所以这个处理链条每…

C#几种截取字符串的方法

在C#编程中&#xff0c;经常需要对字符串进行截取操作&#xff0c;即从一个长字符串中获取所需的部分信息。本文将介绍几种常用的C#字符串截取方法&#xff0c;并提供相应的示例代码。 目录 1. 使用Substring方法2. 使用Split方法3. 使用Substring和IndexOf方法4. 使用Regex类…

【PTQ】Cross-Layer Equalization跨层均衡-证明和实践详细解读

Cross-Layer Equalization跨层均衡 aimet解读 符合规则的模型结构 统一要求&#xff1a;单数据流&#xff0c;中间激活不流向其他地方概念说明&#xff1a; Conv: gruoups1的普通卷积&#xff0c;包括TransposedConv和ConvDepthwiseConv: 深度可分离卷积&#xff0c;groupsi…

青少年编程学习 等级考试 信奥赛NOI/蓝桥杯/NOC/GESP等比赛资料合集

一、博主愚见 在当今信息技术高速发展的时代&#xff0c;编程已经成为了一种必备的技能。随着社会对于科技人才的需求不断增加&#xff0c;青少年编程学习正逐渐成为一种趋势。为了更好地帮助青少年学习编程&#xff0c;提升他们的技能和素质&#xff0c;博主结合自身多年从事青…

C++:map和set的封装原理

文章目录 红黑树的封装map和set的封装红黑树迭代器的实现operator 和 -- 的实现的实现过程 迭代器的其他模块 整体实现 本篇写于红黑树模拟实现后&#xff0c;对map和set进行封装&#xff0c;模拟实现map和set内部的原理 首先&#xff0c;map和set的底层逻辑是红黑树&#xf…