线程池总结

一.线程池的概念

        线程池是一种管理和复用线程的设计模式,主要用于提高多线程编程中的效率。它通过维护一组线程来执行多个任务,从而避免频繁地创建和销毁线程所带来的性能开销。

        线程池里取线程比从系统中申请线程更高效的原因,也是因为线程池是纯用户态,比经过内核态更可控。(内核态和用户态属于操作系统中的概念。操作系统 = 操作系统内核 + 操作系统配套的应用程序。(操作系统配套的应用程序指的是我们电脑上下的软件,比如浏览器。而操作系统的内核指的是操作系统的核心部分,用来负责完成一个操作系统的核心操作。管理向下的硬件资源,调用驱动程序硬件设备等和向上的给应用程序提供稳定的环境和系统API))很多应用程序由内核统一负责管理和服务,内核里的工作就可能很繁忙,以至于提交给内核的任务是不可控的。就没办法第一时间执行我们需要的操作。

二.线程池的参数

        这个为java标准库中最复杂的线程池参数,其中还有另外三个,但是搞懂这个其他三个也就懂了。

1.核心线程数和最大线程数

        说明此线程是可以扩容的。核心线程数指的是初始状态下有一定会存在多少个线程的数量,而最大线程数是等于核心线程数+非核心线程数的最大值。非核心线程数是通过系统繁忙的需要来创建的。类似于一个公司的正式工和临时工,正式工是不能随便辞退的,但是临时工是在某个时刻公司繁忙的时候才会需要的,公司不繁忙的时候就不会需要,当不需要的时候直接辞退就行了。

2.非核心线程的存活时间和存活时间的单位

        设置非核心线程的存活时间是为了当不需要额外的线程时减少系统的开销。

        其中空闲时间的单位有以下几种:

3.工作队列

        线程池工作过程是典型的“生产者消费者模型”,程序员通过使用submit的操作将需要执行的任务设定到线程池里,线程池内部的工作线程就会负责这些任务。此处就会有一个阻塞队列。这个队列我们可以自行定义容量,自行定义队的类型。

4.线程工厂

        这里先解释一下工厂的概念:这里的工厂也是一种设计模式叫工厂设计模式,这个模式是在创建类的实例的时候使用的设计模式。(因为构造方法里面有一个“坑”,用工厂设计模式来填“坑”)

        在坐标系中一个点的坐标我们可以通过X和Y来表示,也可以通过极坐标的方式来表示一个点在坐标系中的位置。

        这种在Java中没办法构成方法的重载的,所以就需要通过工厂的方式来进行填构造方法的“坑”。工厂设计模式通过“普通方法”(通常静态方法)完成对象构造和初始化。

        这是最简单的工厂设计模式。通过static创建对象的方法被称为工厂方法。有时候,工厂方法会放在其他的单独类里面,此时这个类,称为工厂类。

        线程池中的是Thread类的工厂类,通过这个类完成Thread的对象创建和初始化操作。并且对线程池中的线程进行批量的设置属性。(此处一般进行调整,就是用标准库提供的ThreadFactory的默认值即可)

        ThreadFactory默认值。

        需要对线程池中的线程进行批量设置属性通过重写这里的newThread方法即可。

5.拒绝策略(非常重要)

        当线程池中的任务队列满了,还需要继续添加队列时,如何进行下一步。这里Java标准库中给了4种不同的拒绝策略。

(i)添加任务时,抛出异常

(ii)线程池拒绝执行,由调用submit的线程负责执行

(iii)把任务队列中最老的任务剔除,执行新添加的任务。

(iv)把任务队列中最新的任务剔除。

三.Executors创建线程池

        由于ThreadPoolExecutors功能强大,使用不方便,标准库对这个类进一步的封装了一下。Executors 提供了一些工厂方法,可以更方便的构造出线程池。

        其中我们重点了解前两个。第一个设置了非常大的线程数,就可以对线程池进行不停的扩容。第二个把核心线程数和最大线程数设置为相同数目,不会自动扩容。第三个是单个线程池,第四个是带有定时器的线程池。

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

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

相关文章

基于深度学习的太阳暗条检测(2020年以来)

A universal method for solar filament detection from Hα observations using semi-supervised deep learning A&A, 686, A213 (2024) A universal method for solar filament detection from Hα observations using semi-supervised deep learning (aanda.org) ABS…

七夕特辑:用Ta的照片定制专属二维码,传递独一无二的爱

七夕火热进行中,有人还在纠结送啥礼物合适么? 围观可能是“全网第一人”的技术助力七夕之特别礼物 !!! 欢迎扫码关注围观。 七夕特辑:扫码解锁爱情故事,让爱穿越时空 七夕特辑:用…

猫头虎推荐:人类通向AGI之路 史上最重磅的20篇论文你值得学习

猫头虎推荐:人类通向AGI之路 史上最重磅的20篇论文你值得学习 👋 大家好,我是猫头虎,今天我们为大家带来一篇穿越时空的AI研究大作!这篇文章将带你领略过去15年推动人工智能(AI)发展的20篇经典…

【驱动篇】龙芯LS2K0300之RTC设备驱动

实验介绍 本次实验是关于pcf8563 RTC模块的驱动移植,大致流程如下: 注册i2c设备驱动编写RTC设备驱动将device和driver驱动部署到开发板并装载,通过hwclock命令来测试 模块连接 VCC接Pin2,GND接Pin1,SCL接Pin16&…

比OpenAI的Whisper快50%,最新开源语音模型

生成式AI初创公司aiOla在官网开源了最新语音模型Whisper-Medusa,推理效率比OpenAI开源的Whisper快50%。 aiOla在Whisper的架构之上进行了修改采用了“多头注意力”机制的并行计算方法,允许模型在每个推理步骤中预测多个token,同时不会损失性…

略谈set与map的pair封装与进入哈希

引子:之前我们讲了红黑树的自实现,与小小的接口实现,那set与map的pair封装是如何实现的呢?,今天我们来一探究竟,而且我们也要进入新章节--哈希 对于operator--()的封装: 注意:牢记思…

一款.NET开发的AI无损放大工具

一款.NET开发的AI无损放大工具 思维导航 前言项目功能支持语言系统要求项目源代码项目运行小图片进行无损放大项目源码地址优秀项目和框架精选 前言 今天大姚给大家分享一款由.NET开源(GPL-3.0 license)、基于腾讯ARC Lab提供的Real-ESRGAN模型开发的A…

Linux知识复习第2期

RHCE 远程登录服务-CSDN博客 Linux 用户和组管理_linux用户和组的管理-CSDN博客 Linux 文件权限详解-CSDN博客 目录 1、sshd 免密登录 (1)纯净实验环境 (2)生成密钥 (3)上锁 2、用户管理 (1)添加新用户 (2)删除用户 (3)修改用户信息 (4)为用户账号设…

【Linux:环境变量】

目录 命令行参数: 环境变量: 命令行参数: argv是一个char*类型的数组,里面存放着字符、字符串的指针地址,且该数组必定是以NULL结尾 命令行中启动的进程都是Bash的子进程,命令行参数的存在本质上就是通过…

[qt] 多线程应用01

源码: 点击此处 一 多线程应用 实现一个多线程的网络时间服务器,利用多线程功能的技术,为每个客户端返回当前的时间,并且在返回后自动退出。同时,服务器也会记录当前受到的请求次数。其实这相当于一个ntp时间服务器 二 服务器实…

职场中,这些事情是禁忌

越级打报告 身处职场,一定要清晰地明确自己所处的位置。要了解部门的运营架构和人事结构,这是身为职场人对自己的最基本的要求。以此确保一旦工作中出现什么问题时,你能找到相应的负责人。但是这里一定要注意,千万不要故作聪明越…

【数据结构】顺序表实现

0. 前言 小伙伴们大家好,从今天开始,我们就开始学习《数据结构》这门课程~ 首先想给大家讲讲什么是数据结构? 0.1 数据结构是什么? 数据结构是由“数据”和“结构”两词组合⽽来。 什么是数据? 比如常⻅的数值1、…

【Material-UI】Button 中的点击事件处理(Handling clicks)详解

文章目录 一、点击事件处理基础1. 基本用法2. 事件处理器的传递 二、实际应用中的注意事项1. 事件处理逻辑的优化2. 避免过多的状态更新3. 使用合适的事件类型 三、关于文档中未提及的原生属性四、最佳实践1. 无障碍性2. 视觉反馈3. 防止重复点击 五、总结 在现代前端开发中&am…

【竞品分析】竞品分析的步骤

在产品经理的工作实际中,对产品的设计离不开竞品分析。 竞品分析可以辅助我们进行可行性评估、制定产品战略、优化产品迭代等。 可以说,竞品分析是贯穿产品生命周期的,是产品经理的必备专业技能。 个人认为,做自己家的产品是单一的视角,多做竞品分析会…

【微信小程序开发】——奶茶点餐小程序的制作(二)

👨‍💻个人主页:开发者-曼亿点 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 曼亿点 原创 👨‍💻 收录于专栏&#xff1a…

HTML 元素提供的附加信息--属性 ——WEB开发系列03

HTML 属性是指用于描述 HTML 元素的额外信息,它们提供了元素的特定配置或行为,属性通常包含在 HTML 元素的开始标签中。 元素也可以拥有属性,属性看起来像这样: 属性是元素的附加信息,它们不会显示在实际内容中。在前述…

Hack The Box-Resource

总体思路 phar反序列化->SSH CA私钥泄露->SSH CA私钥滥用->SSH脚本滥用 信息收集&端口利用 nmap -sSVC itrc.ssg.htb目标开放了两个ssh端口和一个80端口,先查看80端口 网站是一个SSG IT资源中心,主要用于解决网站问题、管理 SSH 访问、清…

【学习总结】MySQL篇

MySQL MySQL索引 B树 B树和作为索引,有两个明显特点 一是、他的层级非常低,我们都知道传统的平衡二叉树。它们的阶为2,如果数据量很大,AVL树(传统的平衡二叉树)的层级就非常深。但是B树,它是…

基于STM32F407+NBIOT+华为云IOT平台设计的环境检测系统

基于STM32F407NBIOT华为云IOT平台设计的环境检测系统实现的功能: 【1】能够采集本地环境的温度、湿度、烟雾浓度,火光信息,在OLED显示屏上显示。 如果检测到烟雾、温度、火光超过阀值会触发蜂鸣器报警。 【2】能够通过NBIOT将本地设备采集的信…

在 Django 表单中传递自定义表单值到视图

在Django中,我们可以通过表单的初始化参数initial来传递自定义的初始值给表单字段。如果我们想要在视图中设置表单的初始值,可以在视图中创建表单的实例时,传递一个字典给initial参数。 1、问题背景 我们遇到了这样一个问题:在使…