线程池的使用

线程池的作用

  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();}}
}

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【华为OD题库-009】食堂供餐-Java

题目 某公司员工食堂以盒饭方式供餐。为将员工取餐排队时间降低为0&#xff0c;食堂的供餐速度必须要足够快。现在需要根据以往员工取餐的统计信息&#xff0c;计算出一个刚好能达成排队时间为0的最低供餐速度。即&#xff0c;食堂在每个单位时间内必须至少做出多少份盒饭才能满…

ADC、DMA以及串口之间的联系和区别?

ADC、DMA和串口都是嵌入式系统中常用的模块&#xff0c;它们之间有以下联系和区别&#xff1a; 联系&#xff1a; ADC和DMA都是用于数据采集和传输的模块&#xff0c;ADC可以将模拟信号转换为数字信号&#xff0c;DMA可以在不经过CPU的情况下实现数据的高速传输。而串口则是一…

同城服务共享台球室小程序系统:打造智能化的台球体验

一、引言 随着科技的发展和人们生活节奏的加快&#xff0c;对于休闲娱乐的需求也在不断增长。台球作为一种广受欢迎的休闲活动&#xff0c;其智能化和便利性的需求也日益凸显。本文将探讨如何通过同城服务共享台球室小程序系统&#xff0c;打造智能化的台球体验。 二、系统设…

MySQL(14):视图

数据库对象 对象描述表(TABLE)表是存储数据的逻辑单元&#xff0c;以行和列的形式存在&#xff0c;列就是字段&#xff0c;行就是记录数据字典就是系统表&#xff0c;存放数据库相关信息的表。系统表的数据通常由数据库系统维护&#xff0c;程序员通常不应该修改&#xff0c;只…

mysql 讲解(1)

文章目录 前言一、基本的命令行操作二、操作数据库语句2.1、创建数据库2.2、删除数据库2.3、使用数据库2.4 查看所有数据库 三、列的数据类型3.1 字符串3.2 数值3.3 时间日期3.4 空3.5 int 和 varchar问题总结&#xff1a; 四、字段属性4.1 UnSigned4.2 ZEROFILL4.3 Auto_InCre…

ARPG----C++学习记录05 Section12 动画蒙太奇,收拿剑,MetaSound,调整动画

代码更新 https://github.com/BAOfanTing/ARPG_Game_Code/commit/c629270e49496ba1bcbaf03780d23c1842ca5e7a Animation Montages动画蒙太奇 蒙太奇的工作流程 新建一个鼠标左键的按键映射&#xff0c;下载一些攻击动画&#xff0c;重定向给我们的人物&#xff0c;新建一个动画…

PCL中的离群点去噪-StatisticalOutlierRemoval

作用是去除稀疏离群噪点。在采集点云的过程中&#xff0c;由于测量噪声的影响&#xff0c;会引入部分离群噪点&#xff0c;它们在点云空间中分布稀疏。在估算点云局部特征&#xff08;例如计算采样点处的法向量和曲率变化率&#xff09;时&#xff0c;这些噪点可能导致错误的计…

若依系统富文本框上传图片报错!

报错如下&#xff1a; 原因&#xff1a;如图&#xff0c;富文本路径中存在 / 字符&#xff0c;导致上传出错。 解决方案&#xff1a;将富文本框内容在前端进行加密&#xff0c;后端再解密。 前端&#xff1a; 安装 crypto-js 插件 npm install crypto-js 创建工具类 :在 sr…

使用MVS-GaN HEMT紧凑模型促进基于GaN的射频和高电压电路设计

标题&#xff1a;Facilitation of GaN-Based RF- and HV-Circuit Designs Using MVS-GaN HEMT Compact Model 来源&#xff1a;IEEE TRANSACTIONS ON ELECTRON DEVICES&#xff08;19年&#xff09; 摘要—本文阐述了基于物理的紧凑器件模型在研究器件行为细微差异对电路和系统…

signed char表示的最大数据范围是多少?

signed char表示的最大数据范围是多少。 1.首先要明白负数在计算机内是以补码的形式存储的&#xff0c;最高位1代表是负数&#xff0c;最高位0代表正数。 2.char数据类型占据一个字节。 3.一个字节表示的最大负数是(1)111_1111即-127&#xff1b;一个字节表示的最大正数是(0)11…

好心提醒下,幼师姐妹们要知道啊

幼师家人们在不在&#xff1f;在不在&#xff1f; 不会还有姐妹在自己写教案&#xff0c;写总结&#xff0c;写评语啥的吧&#xff0c;这个好东西真的要知道啊&#xff01;&#xff01; 只要输入关键词&#xff0c;马上就能得到你想要的内容&#xff0c;真的很强啊&#xff0…

Pytorch从零开始实战09

Pytorch从零开始实战——YOLOv5-Backbone模块实现 本系列来源于365天深度学习训练营 原作者K同学 文章目录 Pytorch从零开始实战——YOLOv5-Backbone模块实现环境准备数据集模型选择开始训练可视化模型预测总结 环境准备 本文基于Jupyter notebook&#xff0c;使用Python3.…

【java学习—十四】Class类(2)

文章目录 1. Class类2. Class类的常用方法3. 实例化Class类对象&#xff08;四种方法&#xff09; 1. Class类 在 Object 类中定义了以下的方法&#xff0c;此方法将被所有子类继承&#xff1a; public final Class getClass() 以上的方法返回值的类型是一个 Class 类&#xf…

服务器、云服务器、高防服务器都有什么优势呢?

云服务器的优点可以从以下几方面讲&#xff1a; 第一&#xff0c;从技术方面来说&#xff0c;云服务器含有云计算机技术&#xff0c;而云计算技术综合了各种软件和硬件技术。而那些独立的服务器是独立的&#xff0c;不会整合这些技术。 第二&#xff0c;云服务器的安全性能更…

web3 React dapp进行事件订阅

好啊&#xff0c;上文web3 React Dapp书写订单 买入/取消操作 我们已经写好了 填充和取消订单 这就已经是非常大的突破了 但是 留下了一个问题 那就是 我们执行完之后 订单的数据没有直接更新 每次都需要我们手动刷新 才能看到结果 那么 今天我们就来看解决这个问题的事件订阅 …

MapReduce 读写数据库

MapReduce 读写数据库 经常听到小伙伴吐槽 MapReduce 计算的结果无法直接写入数据库&#xff0c; 实际上 MapReduce 是有操作数据库实现的 本案例代码将实现 MapReduce 数据库读写操作和将数据表中数据复制到另外一张数据表中 准备数据表 create database htu; use htu; creat…

android手机平板拓展电脑音频

&#xff08;1&#xff09;首先确保电脑上有声卡&#xff0c;就是电脑右下角小喇叭能调音量&#xff0c;不管电脑会不会响&#xff0c;如果小喇叭标记了个错误&#xff0c;说明没有声卡&#xff0c;安装图上的虚拟声卡软件。 &#xff08;2&#xff09;图上第一个PC免安装及局…

vscode launch.json

有时新的服务器进行调试时&#xff0c;需要设置调试的launch.json的结果 然后就可以打开一个launch.json 其内容如下 {// 使用 IntelliSense 了解相关属性。 // 悬停以查看现有属性的描述。// 欲了解更多信息&#xff0c;请访问: https://go.microsoft.com/fwlink/?linkid83…

JAVA 版小程序商城免费搭建 多商家入驻 直播带货 商城系统 B2B2C 商城源码之 B2B2C产品概述

1. 涉及平台 平台管理、商家端&#xff08;PC端、手机端&#xff09;、买家平台&#xff08;H5/公众号、小程序、APP端&#xff08;IOS/Android&#xff09;、微服务平台&#xff08;业务服务&#xff09; 2. 核心架构 Spring Cloud、Spring Boot、Mybatis、Redis 3. 前端框架…

Go语言error错误处理

error Go语言内置错误接口类型&#xff0c;任何类型只要是实现了Error()string方法&#xff0c;都可以传递error接口类型变量。Go语言典型的错误处理方式是将error作为函数最后一个返回值。在调用函数时&#xff0c;通过监测其返回的error值是否为nil来进行错误处理 Go语言标准…