线程池:神秘的“轻量级线程”

当前我们的多线程部分已经学习了几个代码案例:

1.单例模式

2.阻塞队列 -> 生产者消费者模型

3.定时器

4.线程池

而线程存在的意义就是,使用进程来实现并发编程会“太重了”,创建和销毁进程都会比较耗资源。

但是线程会更加高效。此时,使用多线程就可以在很多时候代替进程来实现并发编程了。

但是随着并发程度的提高,随着我们对于性能要求的标准的提高,咱们发现,好像线程也没有那么轻量。

当我们需要频繁创建销毁线程的时候,就发现好像开销还是挺大的~

想要进一步的再提高这里的效率,想出了两种办法:

1.搞一个“轻量级进程” (协程/纤程)(但还没有被加入到Java标准库中)

2.使用线程池(字符串常量池、数据库连接池),来降低创建/销毁线程的开销。

也就是说,现在有一个可以存放线程的池子,事先把需要使用的线程创建好,后面需要使用的时候,直接从池子里去出出来。如果用完了也还给池。(因为这两个动作比创建/销毁更加高效)

创建/销毁线程,是交由操作系统内核完成的,但是从池子里获取/还给池,是咱们自己用户代码就能实现的,不必交给内核操作~

相比于内核来说,用户态,程序执行的行为是可控的,如果要想做某个工作,就会非常干净利落的完成(比如从池子里取、还给池子)

但是如果是通过内核,此时不清楚内核身上背负着多少个任务,无法确定内核都要做哪些工作,整体过程是不可控的~

ExecutorService pool = Executors.newFixedThreadPool(10);

工厂模式:简单的来说,就是用普通的方法,来代替构造方法创建对象~

此处就是构造出一个10个线程的线程池,然后就可以随时安排这些线程帮我们干活了~

线程池提供了一个重要的方法:submit,可以给线程池提交若干个任务

public class testdemo {public static void main(String[] args) {ExecutorService pool = Executors.newFixedThreadPool(10);for(int i = 0 ; i < 1000 ; i++){int n = i;pool.submit(new Runnable() {@Overridepublic void run() {System.out.println("hello" + n);}});}}
}      运行程序后发现,main线程结束了,但是整个线程没结束,线程池中的线程都是前台线程,此时会组织进程结束~

这段代码中,往线程池放了1000个任务,1000任务就是由这10个线程来平均分配一下,然后再执行打印,差不多是一个线程执行100个(注意这里并非是严格的平均,可能有的多一个,有的少一个)

每个线程都执行完一个打印的任务后,再执行下一个任务,由于每个任务执行时间都差不多,因此 每个线程做的任务数量就差不多~

进一步的可以认为:这1000个任务,就在一个队列中排队,这10个线程,就依次来取队列中的任务,取一个就执行一个执行完了再执行下一个~

问题就来了:

这么简单的代码中,为什么不直接打印的时候打印 i 呢?而是通过 int n = i 这样的操作来完成~

这其中涉及到变量捕获。

 

Executors提供的工厂类

 还有一个包需要我们注意一下:

java.util.concurrent   这个包里放的很多类都是和并发编程(多线程编程密切相关的) 所以这个包也叫做juc

corePoolSize :          核心线程数

maximumPoolSize:最大线程数

ThreadPoolExecutor相当于把里面的线程分为两类:

一类是核心线程(理解为正式员工),一类是临时工(实习生),这俩之和是最大线程数~

同时允许正式员工摸鱼,不允许实习生摸鱼~如果实习生摸鱼太久了,就会被销毁(开除)。

整体的策略,就是正式员工保底,临时工动态调节。

long keepAliveTime: 描述了临时工摸鱼的最大时间

TimeUnit unit : 时间单位(s,ms,分钟)

BlockingQueue<Runnable> workQueue:线程池的任务队列

ThreadFactory threadFactory : 用于创建线程,线程池是需要创建线程的

RejictedExecutionHandler hander : 描述了线程池的“拒绝策略”

实际开发的时候,线程池的线程数,设定成多少合适呢?

并没有具体的数字,要具体情况具体分析,不能说是1.5N、2N(N是cpu的核心数)等等~

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

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

相关文章

K8S名称空间和资源配额

Kubernetes 支持多个虚拟集群&#xff0c;底层依赖于同一个物理集群。 这些虚拟集群被称为名称空间。名称空间namespace是k8s集群级别的资源&#xff0c;可以给不同的用户、租户、环境或项目创建对应的名称空间&#xff0c;例如&#xff0c;可以为test、dev、prod环境分别创建各…

Stable Diffusion 参数介绍及用法

大模型 CheckPoint 介绍 作用&#xff1a;定调了作图风格&#xff0c;可以理解为指挥者 安装路径&#xff1a;models/Stable-diffusion 推荐&#xff1a; AnythingV5Ink_v32Ink.safetensors cuteyukimixAdorable_midchapter2.safetensors manmaruMix_v10.safetensors counterf…

Python 图片处理笔记

import numpy as np import cv2 import os import matplotlib.pyplot as plt# 去除黑边框 def remove_the_blackborder(image):image cv2.imread(image) #读取图片img cv2.medianBlur(image, 5) #中值滤波&#xff0c;去除黑色边际中可能含有的噪声干扰#medianBlur( Inp…

买卖股票的最佳时机

一、题目。 给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置…

2023年云南省职业院校技能大赛中职组“网络安全”赛项样题

2023年云南省职业院校技能大赛 中职组“网络安全”赛项样题 一、竞赛时间 总计&#xff1a;180分钟 二、竞赛阶段 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 A、B模块 A-1 登录安全加固 180分钟 200分 A-2 数据库加固 A-3 服务加固SSH\VSFTPD A-4 防火墙策…

php预约系统源码 网上预约小程序开发源码 整套系统搭建让在线预约更便捷

随着互联网技术的发展&#xff0c;越来越多的服务行业开始通过网上预约系统来实现便捷的客户管理和服务提供。PHP预约系统源码作为一种成熟的技术方案&#xff0c;可以帮助商家快速搭建自己的预约系统&#xff0c;提高工作效率&#xff0c;优化客户体验。 分享一个php预约系统…

常见的排序算法及时间空间复杂度

排序算法是计算机科学中的基本算法之一&#xff0c;它用于将一组数据按照某种顺序进行排列。下面是一些常见的排序算法&#xff0c;以及它们的思想和时间空间复杂度&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢…

Python日期处理库:掌握时间的艺术

&#x1f482; 个人网站:【工具大全】【游戏大全】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 寻找学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 日期和时间在计算机编程…

《中国数字经济发展指数报告(2023年)》发布

导读 国家统计局《数字经济及其核心产业统计分类(2021)》首次对数字经济及其核心产业统计分类做出详细说明。然而&#xff0c;由于数字经济内涵外延的不断丰富&#xff0c;区域数字经济发展的量化评估仍在持续发展的过程中&#xff0c;以量化模型方式能够更加客观全面反映新时…

flash attention的CUDA编程和二维线程块实现softmax

本文参考了链接添加链接描述 flash attention介绍 flash attention的介绍可以参考论文:FlashAttention: Fast and Memory-Efficient Exact Attention with IO-Awareness,具体的数学公式参考下面这个图片:其中注意关于矩阵S有两个维度,softmax的操作维度是dim=1,用pytorc…

【HarmonyOS】元服务卡片router实现跳转到指定页面

【关键字】 元服务卡片、router跳转不同页面 【写在前面】 本篇文章主要介绍开发元服务卡片时&#xff0c;如何实现从卡片中点击事件跳转到指定的应用内页面功能。此处以JS UI开发服务卡片为例&#xff0c;JS卡片支持组件设置action&#xff0c;包括router事件和message事件&…

蒙特卡洛方法的数学基础-1

蒙特卡洛方法的数学基础-1 概率论 Bayes 公式 常用分布 Binominal Distribution Poisson Distribution Gaussian Distribution Exponential Distribution Uniform Distribution 大数定理 均匀概率分布随机地取N个数xi &#xff0c;函数值之和的算术平均收敛于函数的期望值 …

基于nRF7002-DK的NFC功能切换系统(nRF Connect SDK+NFC)

目录 项目介绍硬件介绍项目设计开发环境及工程目录总体流程图硬件初始化NFC功能实现文本记录安卓应用打开按键切换功能 功能展示项目总结 &#x1f449; 【Funpack2-6】基于nRF7002-DK的NFC功能切换系统 &#x1f449; Github: EmbeddedCamerata/nRF7002-DK-nfc-function-switc…

ADS放大器模型参数含义

ADS放大器模型参数含义 S21 : Forward Transmission Coefficient, use xj*y, polar(x,y), dbpolar(x,y) for complex value 增益&#xff0c;X是增益大小&#xff0c;y是相位 S11 : Forward Reflection Coefficient, use xj*y, polar(x,y), dbpolar(x,y), vswrpolar(x,y) for …

新手学习:ArcGIS对shp文件裁剪

新手学习&#xff1a;ArcGIS对SHP文件裁剪 新手学习 记录每个步骤&#xff0c;因为有很多控件可能刚开始还不熟悉&#xff0c;根本不知道在哪里&#xff0c;所以写的比较详细。 1.添加要裁剪的shp文件 2.查看shp文件的地理坐标系 双击shp文件&#xff0c;就可以查看shp文件的…

C语言——贪吃蛇小游戏

目录 一、ncurse 1.1 为什么需要用ncurse&#xff1a; 1.2 ncurse的输入输出&#xff1a; 1.2.1 如何使用ncurse&#xff1a; 1.2.2 编译ncurse的程序&#xff1a; 1.2.3 测试输入一个按键ncurse的响应速度&#xff1a; 1.3 ncurse上下左右键获取&#xff1a; 1.3.1 如…

TypeScript 从入门到进阶之基础篇(一) ts类型篇

系列文章目录 文章目录 系列文章目录前言一、安装必要软件二、TypeScript 基础类型1.基础类型之 数字类型 number2.基础类型之 字符串类型 string3.基础类型之 布尔类型 boolean4.基础类型之 空值类型 void5.基础类型之 null 、undefined类型6.基础类型之 任意类型 any &#x…

解决ModuleNotFoundError: No module named ‘diffusers.models.cross_attention‘

目录 项目场景: 问题描述 原因分析: 解决方案: 方案一:

面向面试知识--Lottery项目

面向面试知识–Lottery项目 1.设计模式 为什么需要设计模式&#xff1f; &#xff08;设计模式是什么&#xff1f;优点有哪些&#xff1f;&#xff09; 设计模式是一套经过验证的有效的软件开发指导思想/解决方案&#xff1b;提高代码的可重用性和可维护性&#xff1b;提高团…

vue3 - Element Plus暗黑模式适配、切换及自定义颜色

GitHub Demo 地址 在线预览 Element Plus 2.2.0 版本开始支持暗黑模式&#xff0c;启用方式参考 Element Plus 官方文档 - 暗黑模式 demo通过Element Plus和VueUse 的 useDark 方法实现具有自动数据持久性的响应式暗黑模式。 安装 npm install element-plus --save npm in…