线程池详细介绍

news2024/11/20 3:23:36
  1. 线程池执行流程

在这里插入图片描述

  1. 线程池的状态

    • RUNNING
    • SHUTDOWN
    • STOP
    • TIDYING
    • TERMINATED
  2. 线程池优雅关闭

线程池有两个关闭方法,shutdown()shutdownNow()shutdown()切换到SHUTDOWN状态,shutdownNow()切换到STOP状态,当队列和线程池都为空的时候切换到TIDYING状态,最后执行terminated()进入到TERMINATED状态。

关闭线程池的时候,调用`shutdown()`和`shutdownNow()`线程池不会立即关闭。如果需要在线程池关闭之后做资源回收处理等,可以
调用`awaitTermination()`来等待线程池关闭;`awaitTermination()`会不断循环判断线程池是否达到了最终状态TERMAINATED。
如果是就返回,如果不是就通过 termination 条件变量阻塞一段时间,之后继续判断。

shutdown()不会清空任务队列,会等所有任务执行完成,只会中断空闲的线程;shutdownNow()会中断所有线程,清空任务队列。

    // executor.shutdownNow();
    executor.shutdown(); // 关闭线程池
    // 如果希望在线程池彻底关闭之后进行其他操作比如资源的回收等,可以:
    try {
        boolean flag = true;
        do {
            flag = !executor.awaitTermination(500, TimeUnit.MILLISECONDS);
        } while (flag);
    } catch (InterruptedException e) {
        // 异常处理
    }

线程池状态之间的迁移过程
在这里插入图片描述

  1. 线程池的拒绝策略

    • CallerRunsPolicy:调用者直接在自己线程里执行,线程池不处理;
    • AbortPolicy:线程池抛异常。默认拒绝策略;
    • DiscardPolicy:线程池直接丢掉任务;
    • DiscardOldestPolicy:删除队列中最早的任务,将当前任务入列;
  2. corePoolSize和maxPoolSize一般设置为多大

    • CPU密集型

      ​ CPU密集型就是指该任务需要大量计算而没有阻塞,CPU一直全速运行;CPU密集型只有在真正的多核CPU上才能得到加速(通过多线程)。CPU密集型任务配置尽可能少的线程数。

      CPU密集型线程数配置公式:CPU核数 + 1

    • I/O密集型

      ​ IO密集型指该任务需要大量的IO,即大量的阻塞。在单线程上运行IO密集型的任务会导致大量的CPU运算能力浪费在等待上。所以IO密集型任务中使用多线程可以大大加速程序运行。即使在单核CPU上,这种加速主要利用了被浪费掉的阻塞时间。

      由于IO密集型任务的线程并不是一直在执行任务,大部分线程都在阻塞,所以应配置尽可能多的线程

      • 配置方式一;

        IO密集型线程数配置公式一:CPU核数 * 2

      • 配置方式二

        IO密集型线程数配置公式二:CPU核数 / (1 - 阻塞系数) (阻塞系数在0.8到0.9之间)

        比如:8核 / (1 - 0.9) = 80个线程

      线程数量只增加不减少也不行。当负载降低时,可减少线程数量,如果一个线程空闲时间达到 keepAliveTime,该线程就退出。默认情况下线程池最少会保持 corePoolSize 个线程。

      maxPoolSize 最大线程数在生产环境上往往设置成corePoolSize一样,减少在处理过程中创建线程的开销

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

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

相关文章

学习 | ANSYS经典界面在压力容器分析设计中的应用

导读:分析设计作为压力容器设计的重要方法,不仅解决了压力容器常规设计所不能解决的问题,而且也是压力容器设计观点与方法上的一个质的飞跃。 分析设计通常分为两类:应力分类法(弹性方法)和直接法&#xf…

基于FPGA的SD NAND图片显示实现

文章目录 0、前言 1、目标 2、图片的预处理 3、SD NAND的预处理 4、FPGA实现 4.1、详细设计 4.2、仿真 4.3、实验结果 0、前言 在上一篇文章《基于FPGA的SD卡的数据读写实现(SD NAND FLASH)》中,我们了解到了SD NAND Flash的相关知识…

大(json)文件压缩(minify)

文章目录Preface解决方案Preface 现在在做一个 GIS 地图的项目, 做过地图的应该就知道各省/市/县的json文件有多大(大部分都是经纬度数据), 就直接放前台public目录下了. 文件过大, 上传到服务器就占用很多空间, 这时候就有人提出需求, 让把这个问题处理一下. (虽然这个事情没…

mysql日志管理 、备份与恢复

目录 一、数据备份的重要性与分类 1、数据备份的重要性 2、从物理与逻辑的角度,备份分为 3、从数据库的备份策略角度,备份可分为 3.1 完全备份(只适合第一次) 3.2 差异备份(用的较少,有丢失数据的现象…

应用 Serverless 化,让业务开发心无旁骛

我们希望让用户做得更少而收获更多,通过Serverless化,用云就像用电一样简单。”张建锋表示,Serverless 让云计算从一种资源真正变成一种能力,未来云将全面 Serverless 化,更加接近“电网”模式,按计算的调用…

使用Visual Studio Code 进行Python编程

1、下载Visual Studio Code 到微软的Visual Studio Code官方主页下载Visual Studio Code: Visual Studio: 面向软件开发人员和 Teams 的 IDE 和代码编辑器Visual Studio 开发工具和服务让任何开发人员在任何平台和语言的应用开发都更加轻松。 随时随地免费使用代码编辑器或 I…

web期末网站设计大作业:基于HTML+CSS+JavaScript制作新能源汽车企业网站

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…

负载均衡四层和七层的区别

一. 什么是负载均衡 1)负载均衡(Load Balance)建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。负载均衡有两方面的含义&#…

基于Boost库的在线搜索引擎

文章目录Boost库搜索引擎1. 项目背景2. 宏观原理3. 搜索引擎技术栈和项目环境4.正排索引vs倒排索引&#xff08;index.hpp&#xff09;1. 正排索引:数组vector<>2. 目标文档进行分词(方便倒排索引和查找)3. 倒排索引&#xff1a;unordered_map<>模拟一次查找的过程…

反向传播不香了?解读 Hinton 大佬的 Forward-Forward 算法

今天解读一篇Hinton大佬最近分享的论文。 在最近的NeurIPS2022会议上&#xff0c;图灵奖得主Hinton作为演讲嘉宾&#xff0c;分享了一个题为《The Forward-Forward Algoritm: Some Preliminary Investigations》的论文。 该论文提出了一种取代反向传播的前向-前向传播的训练方…

华为机试 - 比较两个版本号的大小

目录 题目描述 输入描述 输出描述 用例 题目解析 算法源码 题目描述 输入两个版本号 version1 和 version2&#xff0c;每个版本号由多个子版本号组成。 子版本号之间由 “.” 隔开&#xff0c;由大小写字母、数字组成&#xff0c;并且至少有一个字符。 按从左到右的顺…

spirng boot 打包,胖fat包和瘦thin包

一、打胖包fat 打胖包采用的是spring的标准来执行&#xff0c;所以使用的是spring boot提供的打包插件 参考来源&#xff1a;打包Spring Boot应用 - 廖雪峰的官方网站 步骤 pom配置 <project ...>...<build><plugins><plugin><groupId>org.s…

Python 奇淫技巧,助你更好的摸鱼

作为一个数据分析者&#xff0c;日常工作几乎离不 python。一路走来&#xff0c;积累了不少有用的技巧和 tips&#xff0c;现在就将这些技巧分享给大家。这些技巧将根据其首字母按 A-Z 的顺序进行展示。 ALL OR ANY Python 之所以成为这么一门受欢迎的语言一个原因是它的可读…

(一)整合管理范围管理

爬虫组件分析目录概述需求&#xff1a;设计思路实现思路分析1.指定项目章程2.项目管理计划3.指导4。管理项目知识4.5.监控项目工作4.6 实施整体变更控制4.7 项目收尾合同5。范围管理收集需求定义范围创建WBS确认范围&#xff1b;控制范围Survive by day and develop by night. …

Redis内存耗尽后会发生什么?

Redis内存耗尽后会发生什么?前言设置有效期过期策略8 种淘汰策略LRU 算法Redis 如何管理热度数据LFU 算法访问频次递增访问频次递减前言 作为一台服务器来说&#xff0c;内存并不是无限的&#xff0c;所以总会存在内存耗尽的情况&#xff0c;那么当 Redis 服务器的内存耗尽后…

什么是Spring的AOP功能?

如果说 IOC 是 Spring 的核心&#xff0c;那么面向切面编程AOP就是 Spring 另外一个最为重要的核心。 AOP的定义 AOP &#xff08;Aspect Orient Programming&#xff09;,直译过来就是 面向切面编程,AOP 是一种编程思想&#xff0c;是面向对象编程&#xff08;OOP&#xff0…

学会这3个小技巧,轻松去图片水印

有些小伙伴在浏览个别平台时&#xff0c;会看到一些心水的图片&#xff0c;就想保存下来&#xff0c;拿来当头像壁纸&#xff0c;或是发朋友圈时用来配图。但是有些图片下载后会发现自带着平台水印&#xff0c;虽然理解它们是为了保护自身权益&#xff0c;但我们并不是进行商用…

【Java实战】大厂都是怎样进行单元测试的

目录 一、前言 二、单元测试 1.【强制】好的单元测试必须遵守 AIR 原则。 2.【强制】单元测试应该是全自动执行的&#xff0c;并且非交互式的。测试用例通常是被定期执行的&#xff0c;执行过程必须完全自动化才有意义。输出结果需要人工检查的测试不是一个好的单元测试。不…

微服务的灰度发布就该这样设计

实际生产中如有需求变更&#xff0c;并不会直接更新线上服务&#xff0c;最通常的做法便是&#xff1a;切出线上的小部分流量进行体验测试&#xff0c;经过测试后无问题则全面的上线。 这样做的好处也是非常明显&#xff0c;一旦出现了BUG&#xff0c;能够保证大部分的客户端正…

Hygieia (Devops)开源-搭建步骤(一)

什么是Hygieia Hygieia出现在两个独立的仪表板中-一个用于工程师&#xff0c;另一个用于高管-直观地描绘了CICD管道。本质上&#xff0c;Hygieia本身是一个聚合器&#xff0c;可从团队在其CICD管道中使用的各种DevOps工具中提取数据&#xff0c;从而使其易于在仪表板视图中进行…