线程池的使用

线程池的作用

  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,一经查实,立即删除!

相关文章

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;新建一个动画…

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

报错如下&#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; 摘要—本文阐述了基于物理的紧凑器件模型在研究器件行为细微差异对电路和系统…

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

幼师家人们在不在&#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…

web3 React dapp进行事件订阅

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

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. 前端框架…

[单片机课程设计报告汇总] 单片机设计报告常用硬件元器件描述

[单片机课程设计必看] 单片机设计报告常用描述 硬件设计 AT89C51最小系统 AT89C51是美国ATMEL公司生产的低电压&#xff0c;高性能CMOS16位单片机&#xff0c;片内含4k bytes的可反复擦写的只读程序存储器和128 bytes的随机存取数据存储器&#xff0c;期间采用ATMEL公司的高…

数据结构—队列的实现

前言&#xff1a;上次我们已经学习了数据结构中一个重要的线性表—栈&#xff0c;那么我们这一次就来学习另外一个重要的线性表—队列。 目录&#xff1a; 一、 队列的概念 二、 队列的实现&#xff1a; 1.队列的创建 三、 队列的操作 1.初始化队列 2.队尾入队列 3.队头出队列…

CSRF和XSS漏洞结合实战案例

文章目录 CSRF和XSS漏洞结合实战案例实验原理实验步骤信息收集构造CSRF和XSS代码xss注入 CSRF和XSS漏洞结合实战案例 实验环境为csm 实验原理 攻击者利用JavaScript可以构造请求的功能在留言面板构造一个存储型xss注入&#xff0c;里面的内容为js请求。请求新添加用户&…

python matlplotlib/seaborn 绘制曲线的平均值标准差阴影图

1. seaborn 旧版本(0.8.1)中使用tsplot&#xff0c;新版本中使用lineplot 直线代表均值&#xff0c;阴影代表meanstd&#xff08;带有置信区间&#xff0c;参数ci&#xff09; import seaborn as sns import matplotlib.pyplot as plt import numpy as np import pandas as p…

11月14日星期二今日早报简报微语报早读

11月14日星期二&#xff0c;农历十月初二&#xff0c;早报微语早读。 1、江西南城县&#xff1a;限时发放购房补贴政策&#xff0c;三孩家庭每平方米最高补贴500元&#xff1b; 2、2023年中国内地电影市场累计票房突破500亿元&#xff1b; 3、市场监管总局&#xff1a;在全国…

Javaweb开发 利用servlet+jsp+jdbc+tomcat数据库实现登录功能

前言&#xff1a;很久没更新了&#xff0c;今天给大家分享一个Java web的小案例&#xff0c;是一个登录页面&#xff0c;利用Login控制类和JDBC连接数据库&#xff0c;并判断用户名密码是否正确&#xff0c;项目最终部署在Tomcat上。 先看效果 正文 一、前期工作 1.首先我们…

ubuntu上安装edge浏览器

1下载edge浏览器 官网下载 edge浏览器的linux版本可在上面的官网中寻找。 我选择的是Linux(.deb)。 2 安装 可在终端的edge安装包所在的路径下输入下面命令安装。 sudo dpkg -i edge安装包的名称.deb3 安装可能存在的问题 1dpkg:依赖关系问题使得edge-stable的配置工作不…

Docker的安装配置与使用

1、docker安装与启动 首先你要保证虚拟机所在的盘要有至少20G的空间&#xff0c;因为docker开容器很吃空间的&#xff0c;其次是已经安装了yum依赖 yum install -y epel-release yum install docker-io # 安装docker配置文件 /etc/sysconfig/docker chkconfig docker on # 加…