多线程---线程池

文章目录

  • 什么是线程池?
  • 线程池的实现
    • 标准库中的线程池(四种)
    • 自己实现一个线程池
  • 线程池支持的参数
  • 在实际的开发中,线程池的线程数如何确定?

什么是线程池?

线程诞生的原因就是进程太“重量”了。虽然线程的速度已经比进程快了很多,但是如果遇到频繁的创建和销毁线程的情况,那么线程创建和销毁的开销仍不可忽略。这时候就可以使用线程池来进一步提高使用线程的效率。

线程池就是一个“池子”里有很多线程。当需要执行任务的时候,不需要重新创建线程而是直接从“池子”里面取一个线程直接使用;用完了也不需要销毁,再放回“池子”里就行。

为什么从“池子”里取一个线程比创建一个线程快呢?

  1. 从“池子”里取的操作是一个纯用户态的操作;而创建一个线程涉及到了用户态到内核态的转化。很容易理解,转化走的路程远自然执行速度就慢。
  2. 用户态:每个进程自己执行自己的逻辑;内核态:一个操作系统只有一个内核,一个内核要给所有的进程提供服务。
  3. 线程本质是一个PCB,是内核中的数据结构。创建和销毁就要到内核中。

线程池的实现

标准库中的线程池(四种)

     //标准库的线程池public static void main(String[] args) {//创建线程数目动态增长的线程池ExecutorService pool = Executors.newCachedThreadPool();//创建固定线程数的线程池ExecutorService pool1 = Executors.newFixedThreadPool(5);//创建只包含单个线程的线程池ExecutorService pool2 = Executors.newSingleThreadExecutor();//创建定期执行命令的线程池ExecutorService pool3 = Executors.newScheduledThreadPool(5);pool.submit(new Runnable() {@Overridepublic void run() {System.out.println("线程池");}});}

自己实现一个线程池

一个线程池可以同时提交N个任务,有M个线程同时执行这些任务。
使用生产者消费者模型来解决这个问题。

class MyThreadPool{private BlockingQueue<Runnable> blockingQueue = new LinkedBlockingDeque<>();public void submit(Runnable runnable){try {blockingQueue.put(runnable);} catch (InterruptedException e) {e.printStackTrace();}}public MyThreadPool(int m){for (int i = 0; i < m; i++){Thread thread = new Thread(() -> {while (true){try {Runnable runnable = blockingQueue.take();runnable.run();} catch (InterruptedException e) {e.printStackTrace();}}});thread.start();}}
}

线程池支持的参数

在这里插入图片描述
corePoolSize:核心线程数
maximumPoolSize:最大线程数 最大线程数 = 核心线程数 + 临时线程数

keepAliveTime:允许临时线程空闲的时间
unit:时间的单位

workQueue:手动给线程池传一个任务队列
threadFactory:描述了线程是如何创建的。 工厂对象就负责创建线程,程序员可以手动指定创建线程的策略

handler:线程池的拒绝策略。即:线程池的任务队列已经满了,但是还有人往进添加新的任务,该怎么办?
在这里插入图片描述
解释:
策略一:不光新添加的任务不干,旧的任务也不干
策略二:让传递任务的线程干,如果它不干就把这个任务舍弃
策略三:不干新添加的任务,继续执行旧的任务
策略四:干新添加的任务,把旧任务中最早添加进来的任务舍弃

在实际的开发中,线程池的线程数如何确定?

盖棺定论:线程数是不能确定的,需要根据具体的情况具体分析。

因为:

  1. 主机的CPU配置不确定。CPU越多可创建的线程数越多。
  2. 不同程序的执行特点不确定。得看你的代码是干啥的:
    • 如果是100%CPU密集型任务(进行大量的算术运算和逻辑判断),线程数有最大值(比如N)。线程数就算再多也没用,因为CPU已经被占满了。
    • 如果是10%CPU密集型、90%IO密集型任务(进行大量的读写硬盘/网卡操作),线程数可以为10N

但是在工作中,两种任务各占比多少是不确定的。因此,需要我们进行实验验证:

针对自己的程序进行性能测试,分别给线程池设置不同的线程数,比如0.2N、0.5N、N、1.5N、2N.分别记录每种情况下你的程序的一些核心性能指标和负载情况,选择一个适合的线程数即可。

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

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

相关文章

【洛谷算法题】P5709-Apples Prologue / 苹果和虫子【入门2分支结构】

&#x1f468;‍&#x1f4bb;博客主页&#xff1a;花无缺 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 花无缺 原创 收录于专栏 【洛谷算法题】 文章目录 【洛谷算法题】P5709-Apples Prologue / 苹果和虫子【入门2分支结构】&#x1f30f;题目描述&am…

leetcode-哈希表

1. 理论 从哈希表的概念、哈希碰撞、哈希表的三种实现方式进行学习 哈希表&#xff1a;用来快速判断一个元素是否出现集合里。也就是查值就能快速判断&#xff0c;O&#xff08;1&#xff09;复杂度&#xff1b; 哈希碰撞&#xff1a;拉链法&#xff0c;线性探测法等。只是一种…

进程(详解)

进程 进程PCB进程的定义进程的组成进程模式进程的状态进程的运行进程的创建进程的结束孤儿进程僵尸进程僵尸进程的危害 进程的创建pidforkwait案例 进程 PCB 从操作系统理解进程概念-------先描述&#xff0c;后组织 为了使参与并发执行的程序能独立的运行&#xff0c;必须为之…

H5游戏源码分享-接苹果游戏拼手速

H5游戏源码分享-接苹果游戏拼手速 看看在20秒内能接多少个苹果 <html> <head><title>我是你的小苹果</title><meta charset"utf-8"/><meta name"viewport" content"initial-scale1, user-scalableno, minimum-scale…

【ARM 嵌入式 C 入门及渐进 10 -- 冒泡排序 选择排序 插入排序 快速排序 归并排序 堆排序 比较介绍】

文章目录 排序算法小结排序算法C实现 排序算法小结 C语言中常用的排序算法包括冒泡排序、选择排序、插入排序、快速排序、归并排序、堆排序。下面我们来一一介绍&#xff1a; 冒泡排序&#xff08;Bubble Sort&#xff09;&#xff1a;冒泡排序是通过比较相邻元素的大小进行排…

本机spark 通idea连接Oracle的坑

1. 报错&#xff1a;Exception in thread "main" java.lang.NoSuchMethodError: scala.Product.$init$(Lscala/Product;)V 查询网上资料&#xff0c;是idea引入的scala运行环境版本与idea默认的scala版本不一样 也就是写的项目中的pom的spark版本与idea默认的版本不…

【设计模式】第4节:创建型模式之“单例模式”

一、介绍 采取一定的方法保证在整个的软件系统中&#xff0c;对某个类只能存在一个对象实例&#xff0c;并且该类只提供一个取得其对象实例的方法。 不使用单例模式的UML类图&#xff1a; 使用单例模式的UML类图&#xff1a; 使用场景&#xff1a; 需要频繁创建或销毁的对象…

H5游戏分享-烟花效果

<!DOCTYPE html> <html dir"ltr" lang"zh-CN"> <head> <meta charset"UTF-8" /> <meta name"viewport" content"widthdevice-width" /> <title>点击夜空欣赏烟花</title> <sc…

Zabbix监控oxidized备份状态

Zabbix监控oxidized备份状态 原理是利用oxidized的hooks功能调用zabbix_sender推送数据给zabbix_server 参考 https://cloud.tencent.com/developer/article/1657025 https://github.com/clontarfx/zabbix-template-oxidized https://github.com/ytti/oxidized/blob/master/…

Python 日期和时间处理教程:datetime 模块的使用

Python 中的日期不是独立的数据类型&#xff0c;但我们可以导入一个名为 datetime 的模块来使用日期作为日期对象。 示例&#xff1a;导入 datetime 模块并显示当前日期&#xff1a; import datetimex datetime.datetime.now() print(x)日期输出 当我们执行上面示例中的代码…

如何确保PCIe Gen3通道的信号质量

PCIe 3.0设计面对的挑战 PCIe由PCI-SIG协会研发和维护的一个高速标准接口&#xff0c;PCIe3.0是其开发的第三代接口高速差分接口&#xff0c;其单个差分对信号速率可到达8.0Gbps&#xff0c;目前其以广泛的应用于计算机服务器等设备领域。 下图显示的是一个典型的PCIe Gen3的…

天气数据可视化平台-计算机毕业设计vue

天气变幻无常&#xff0c;影响着我们生活的方方面面&#xff0c;应用天气预报信息可以及时了解天气的趋势&#xff0c;给人们的工作、生活等带来便利&#xff0c;也可以为我们为未来的事情做安排和打算&#xff0c;所以一个精准的、易读 通过利用 程序对气象网站大量的气象信息…

ArcGIS笔记13_利用ArcGIS制作岸线与水深地形数据?建立水动力模型之前的数据收集与处理?

本文目录 前言Step 1 岸线数据Step 2 水深地形数据Step 3 其他数据及资料 前言 在利用MIKE建立水动力模型&#xff08;详见【MIKE水动力笔记】系列&#xff09;之前&#xff0c;需要收集、处理和制作诸多数据和资料&#xff0c;主要有岸线数据、水深地形数据、开边界潮位驱动数…

【C++】STL容器——探究不同 [ 迭代器 ] 种类&在STL中的使用方式(15)

前言 大家好吖&#xff0c;欢迎来到 YY 滴C系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; 目录 引言&#xff1a;一.查看STL使用文档时…

Java-API简析_java.io.FilterOutputStream类(基于 Latest JDK)(浅析源码)

【版权声明】未经博主同意&#xff0c;谢绝转载&#xff01;&#xff08;请尊重原创&#xff0c;博主保留追究权&#xff09; https://blog.csdn.net/m0_69908381/article/details/134106510 出自【进步*于辰的博客】 因为我发现目前&#xff0c;我对Java-API的学习意识比较薄弱…

【蓝桥每日一题]-前缀和与差分(保姆级教程 篇3)#涂国旗 #重新排序

目录 题目&#xff1a;涂国旗 思路&#xff1a; 题目&#xff1a;重新排序 思路&#xff1a; 题目&#xff1a;涂国旗 思路&#xff1a; 乍一看好像没啥思路&#xff0c;但是我们需要涂最少的格子&#xff0c;所以要都尝试一下才行&#xff0c;也就是从上面开始白至少一行&am…

selenium测试框架快速搭建(ui自动化测试)

一、介绍 selenium目前主流的web自动化测试框架&#xff1b;支持多种编程语言Java、pythan、go、js等&#xff1b;selenium 提供一系列的api 供我们使用&#xff0c;因此在web测试时我们要点页面中的某一个按钮&#xff0c;那么我们只需要获取页面&#xff0c;然后根据id或者n…

【DevChat】智能编程助手 - 使用评测

写在前面&#xff1a;博主是一只经过实战开发历练后投身培训事业的“小山猪”&#xff0c;昵称取自动画片《狮子王》中的“彭彭”&#xff0c;总是以乐观、积极的心态对待周边的事物。本人的技术路线从Java全栈工程师一路奔向大数据开发、数据挖掘领域&#xff0c;如今终有小成…

如何监听/抓取两个设备/芯片之间“UART串口”通信数据--监视TXD和RXD

案例背景&#xff1a;全网仅此一篇&#xff01;&#xff01;&#xff01; 两个设备/芯片之间采用UART串口通信。我们如何实现芯片1 TXD – > 芯片2 RXD&#xff0c;芯片2 TXD --> 芯片1 RXD两个单线链路上的数据抓取和监听&#xff1f;这篇博客将告诉您。 目录 1 什么是…

Mybatis延迟加载(缓存)

延迟加载 分步查询的优点&#xff1a;可以实现延迟加载&#xff0c;但是必须在核心配置文件中设置全局配置信息&#xff1a;lazyLoadingEnabled&#xff1a;延迟加载的全局开关。当开启时&#xff0c;所有关联对象都会延迟加载 aggressiveLazyLoading&#xff1a;当开启时&…