JUC系列(六) 线程池

news2024/11/18 8:55:18

📣 📣 📣 📢📢📢
☀️☀️你好啊!小伙伴,我是小冷。是一个兴趣驱动自学练习两年半的的Java工程师。
📒 一位十分喜欢将知识分享出来的Java博主⭐️⭐️⭐️,擅长使用Java技术开发web项目和工具
📒 文章内容丰富:覆盖大部分java必学技术栈,前端,计算机基础,容器等方面的文章
📒 如果你也对Java感兴趣,关注小冷吧,一起探索Java技术的生态与进步,一起讨论Java技术的使用与学习
✏️高质量技术专栏专栏链接: 微服务数据结构netty,单点登录,SSMSpringCloudAlibaba
😝公众号😝想全栈的小冷,分享一些技术上的文章,以及解决问题的经验
当前专栏JUC系列

线程池

池化技术、

程序的运行 本质: 占用系统的资源 ! 优化资源的使用 =>池化技术

线程池,连接池,内存吃,对象池, 频繁的创建销毁 十分的浪费资源

线程池的好处:

  1. 降低资源的消耗
  2. 提高响应的速度
  3. 方面管理

线程的复用 可以控制最大并发数量,管理线程

三大方法

下图来自 阿里巴巴开发规约手册

image-20220302213232478

代码实例

public class poolDemo {
    public static void main(String[] args) {
        //单个线程
        ExecutorService Threadpool = Executors.newSingleThreadExecutor();
        // 创建一个固定的线程池大小
        //ExecutorService Threadpool = Executors.newFixedThreadPool(5);
        //可以伸缩的 遇强则强
        // ExecutorService Threadpool = Executors.newCachedThreadPool();

        try {
            for (int i = 0; i < 10; i++) {
                Threadpool.execute(() -> {
                    System.out.println(Thread.currentThread().getName() + "=> ok");
                });
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //线程池使用完毕 一定要关闭
            Threadpool.shutdown();
        }
    }
}

三大方法的创建代码

public static ExecutorService newSingleThreadExecutor() {
    return new FinalizableDelegatedExecutorService
        (new ThreadPoolExecutor(1, 1,
                                0L, TimeUnit.MILLISECONDS,
                                new LinkedBlockingQueue<Runnable>()));
}

public static ExecutorService newFixedThreadPool(int nThreads) {
    return new ThreadPoolExecutor(nThreads, nThreads,
                                  0L, TimeUnit.MILLISECONDS,
                                  new LinkedBlockingQueue<Runnable>());
}

public static ExecutorService newCachedThreadPool() {
    return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
                                  60L, TimeUnit.SECONDS,
                                  new SynchronousQueue<Runnable>());
}

七大参数

七大参数

public ThreadPoolExecutor(int corePoolSize, //核心线程池大小
                          int maximumPoolSize,// 最大核心线程数大小
                          long keepAliveTime,// 超时了没有人调用就会释放
                          TimeUnit unit,// 超时单位
                          BlockingQueue<Runnable> workQueue,// 阻塞队列
                          ThreadFactory threadFactory, // 线程工厂,创建线程的
                          RejectedExecutionHandler handler// 拒绝策略
                         ) 
   

这七个参数分别有什么作用呢,思路图

image-20220303182515651

手动创建线程池,不用封装好的方法,使用原生的线程池方法

ThreadPoolExecutor threadpool = new ThreadPoolExecutor(
        2,
        5,
        3,
        TimeUnit.SECONDS,
        new LinkedBlockingDeque<>(3),
        Executors.defaultThreadFactory(),
        // 这个时候 举例子,银行的人满了 这种方式就是 不处理 抛出异常
        new ThreadPoolExecutor.AbortPolicy()
);

线程池四种拒绝策略

  • new ThreadPoolExecutor.AbortPolicy() 银行的人满了 这种方式就是 不处理 抛出异常

    执行效果

    image-20220303183829048

  • new ThreadPoolExecutor.CallerRunsPolicy() 银行人满了,哪里来的去哪里,回到调用线程输出,不会异常

    执行结果

    image-20220303183923829

  • new ThreadPoolExecutor.DiscardPolicy() 队列满了 就抛出全部任务,

    执行结果

    image-20220303184035431

  • new ThreadPoolExecutor.DiscardOldestPolicy() 尝试和最早的线程竞争 查看是否有位置,没有就抛出任务

    执行结果

    image-20220303184127445

代码实例

public class poolDemo {
    public static void main(String[] args) {
        ThreadPoolExecutor threadpool = new ThreadPoolExecutor(
                2,
                5,
                3,
                TimeUnit.SECONDS,
                new LinkedBlockingDeque<>(3),
                Executors.defaultThreadFactory(),
                new ThreadPoolExecutor.DiscardOldestPolicy()
        );


        //单个线程
        //ExecutorService Threadpool = Executors.newSingleThreadExecutor();
        // 创建一个固定的线程池大小
        //ExecutorService Threadpool = Executors.newFixedThreadPool(5);
        //可以伸缩的 遇强则强
        // ExecutorService Threadpool = Executors.newCachedThreadPool();

        try {
            //最大承载如何计算 : 阻塞队列+max数量
            //超过的话就会 爆出异常 :RejectedExecutionException
            for (int i = 1; i <= 15; i++) {
                threadpool.execute(() -> {
                    System.out.println(Thread.currentThread().getName() + "=> ok");
                });
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //线程池使用完毕 一定要关闭
            threadpool.shutdown();
        }
    }
}

最大负载

  1. CPU密集型 有几个核心就定义几个,可以保证效率最高

        Runtime.getRuntime().availableProcessors() //获取cpu 核心数
    
  2. IO 密集型 判断程序中 十分消耗IO资源的线程,如: 程序 有 15个大型任务,io 十分占中资源,那么设定的比任务数量大 就可以保证一定性能、

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

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

相关文章

若依 数据权限图文详细理解及改造

数据权限 所谓数据权限&#xff0c;就是根据不同角色的登录用户&#xff0c;查看不同的列表数据 若依数据权限 若依的数据权限也是基于角色实现的&#xff0c;支持五种权限模式&#xff0c;按权限大小一次排列&#xff1a; 全部数据权限&#xff0c;表示拥有所有部门的数据…

远程办公:通过cpolar内网穿透,远程桌面控制家里公司内网电脑

疫情反反复复的当下&#xff0c;有时候会遇到需要居家办公的情况&#xff0c;但在办公室的电脑上仍有很多重要资料需要存取&#xff0c;且办公室所在的局域网中也有很多相关资源需要被访问&#xff08;如文件共享服务器、OA系统等&#xff09;。如何能在家通过远程处理好办公事…

Blend for Visual Studio 概述

https://learn.microsoft.com/zh-cn/visualstudio/xaml-tools/creating-a-ui-by-using-blend-for-visual-studio?viewvs-2022 Blend for Visual Studio 可用于设计基于 XAML 的 Windows 和 Web 应用程序。 它提供了与 Visual studio 相同的基本 XAML 设计体验&#xff0c;并添…

长安汽车董事长下场宣传原力技术 全擎引领电动化出行普及时代

11月30日&#xff0c;长安汽车董事长朱华荣在朋友圈发布了长安汽车擘画未来的全新能源及电动化解决方案&#xff1a;长安原力技术——原力智能增程、原力超集电驱。长安汽车成为业内首个通过微信朋友圈发布全新技术方案的车企。短短的3分钟视频&#xff0c;展露着长安汽车对技术…

Mand Mobile - 滴滴出品的适用于金融项目的 Vue 移动端 UI 组件库,免费开源、灵活快速、丰富实用

推荐一款可用性很强的移动 UI 组件库&#xff0c;交互细致&#xff0c;有不少直接就可以用的金融行业的组件。 关于 Mand Mobile Mand Mobile 是一款由滴滴前端团队出品、专为金融场景设计的移动端 Vue 2 组件库&#xff0c;可以帮助前端开发者快速构建项目&#xff0c;UI 风…

ShaderLab实现序列帧动画

序列帧动画介绍 序列帧动画的原理比较简单,依次播放一系列关键帧图像,当播放速度达到一定数值时,看起来就是一个连续的动画。 序列帧动画有很多实现方式,而通过Shader来实现是性能比较好的一种,是由GPU来进行计算。 效果如下 我们使用一张8x8的纹理图片来实现帧动画 步…

单相半波可控整流电路仿真设计(任务书+lunwen+MATLAB仿真源文件)

目 录 摘 要 4 关键字 4 ABSTACT 5 Key words 5 1 绪论 7 1.1半波整流简介 7 1.2 本文研究的内容 7 1.3 单相半波可控整流电路建模与基本参数 7 2 单相半波可控整流电路&#xff08;电阻性负载&#xff09; 10 2.1 电路的结构与工作原理 10 2.2 Matlab下的模型建立 10 2.3 仿真…

使用字典映射关系格式化输出字符串format_map()方法

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 使用字典实现格式化输出 format_map()方法 [太阳]选择题 以下python代码输出正确的一项是? s1姓名&#xff1a;{name}&#xff0c;职业&#xff1a;{job} dict1{name:张三,job:学生} print(…

MP5705 底板 用户手册

一、开发板简介1.1 产品简介 MP5705开发板底板适配本公司相关核心板&#xff0c;型号为MP5650&#xff08;详见MP5650用户手册&#xff09;。通过核心板底板的模式来设计组成完整的开发。底板与核心板采用4个120pin高速板间连接器对插&#xff0c;型号为PANASONIC公司的AXK5A2…

PCL 曲率计算

一、曲率 点云的曲率及计算_点云侠的博客-CSDN博客_点云曲率计算 曲率是曲线弯曲程度的一个度量。 曲率的分类&#xff1a; 1、主曲率、平均曲率、高斯曲率 主曲率&#xff1a; 主曲率计算源码&#xff1a; // template <typename PointInT, typename PointNT, typen…

在低容错业务场景下落地微服务的实践经验

作者&#xff1a;禾连健康 “健康体检是一个低容错的场景&#xff0c;用户到医院体检&#xff0c;由于 IT 原因导致无法完成预约的项目&#xff0c;会对用户体验造成极大的影响。”* ——禾连健康 CTO 邓志豪 禾连健康成立于 2014 年&#xff0c;是一家从体检场景切入的健康管…

Proxmox虚拟环境搭建

一、Proxmox VE简介 ProxmoxVE 是一个完整的、开源的企业虚拟化服务器管理平台。它在单个平台上紧密集成了 KVM 管理程序和 Linux 容器(LXC)、软件定义的存储和网络功能。通过集成的基于 web 的用户界面&#xff0c;您可以轻松地管理虚拟机和容器、集群高可用性或集成的灾难恢…

界面控件DevExtreme——轻松将TreeList数据导出为PDF格式

DevExtreme拥有高性能的HTML5 / JavaScript小部件集合&#xff0c;使您可以利用现代Web开发堆栈&#xff08;包括React&#xff0c;Angular&#xff0c;ASP.NET Core&#xff0c;jQuery&#xff0c;Knockout等&#xff09;构建交互式的Web应用程序&#xff0c;该套件附带功能齐…

DevOps的流程与规范介绍

在DevOps中想要实现快速、高质量的业务交付&#xff0c;流程和规范是至关重要的。流程包含软件从需求提出到产品上线投产全套生命周期的所有环节&#xff0c;如需求提出、代码提交、上线流程等。规范包含敏捷需求分解规范、用户故事编写规范、需求输出表等。 一、流程 流程用…

[附源码]计算机毕业设计游戏交易平台Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

链表高频笔试的OJ题

文章目录 一、合并两个有序链表 解题代码 二、反转链表 解题代码 三、分割链表 解题代码 四、链表的回文结构 解题代码 五、链表相交 解题代码 六、环形链表 解题代码 七、复制带有随机指针的复制链表 解题代码 一、合并两个有序链表 题目来源&#xff1a;牛客网。 题目难度&a…

公共用房管理系统有哪些功能和范围?

数图互通房产管理 数图互通公共用房管理系统的管理功能和范围包括: 1、对全部公房进行图形化、电子化、规范、动态化管理。 2、房屋数据定义:可对校区、片区、建筑物、楼层、房间数据进行增删改查&#xff0c;对房间属性数据进行批量修改。 3、档案及多类型附件管理:可对房…

自适应滤波器更新算法-EP1

自适应滤波器更新算法-EP1 自适应滤波器是回声消除系统中非常重要的一个功能模块&#xff0c;而对于自适应滤波器来说&#xff0c;如果更新滤波器系数则是关键所在。本文将介绍几种现有的滤波器更新算法&#xff0c;并附上Matlab测试代码。 1、LMS算法 1.1算法原理 LMS算法即…

【Matplotlib绘制图像大全】(二十二):Matplotlib绘制气泡图

前言 大家好,我是阿光。 本专栏整理了《Matplotlib绘制图像大全》,内包含了各种常见的绘图方法,以及Matplotlib各种内置函数的使用方法,帮助我们快速便捷的绘制出数据图像。 正在更新中~ ✨ 🚨 我的项目环境: 平台:Windows10语言环境:python3.7编译器:PyCharmMatp…

变电站远程监控维护,工程师不用出差跑断腿

电力的稳定产出和供应是社会生产、人民生活的重要保障之一。电力监控系统的作用是对变电站设备和变配电系统的运行状态进行监控和管理&#xff0c;保证安全稳定生产&#xff0c;使得终端用户的用电更加安全&#xff0c;同时企业自身的智能化管理水平也能有所提升。 随着经济和城…