ThreadPool线程池

news2024/12/27 13:55:55

文章目录

    • 一.概述和架构
    • 二.使用方式和底层原理
    • 三.七个参数介绍
    • 四.工作流程和拒绝策略
    • 五.自定义线程池

一.概述和架构

一种线程使用模式。线程过多会带来调度开销,进而影响缓存局部性和整体性能,而线程池维护着多个线程,等待着监督管理者分配可并发执行的任务,这避免了在短时间任务时创建与销毁线程的代价,线程池不仅能够保证内核的充分利用,还能防止过分调度

线程池的优势:线程池做的工作主要是控制运行的线程数量,处理过程中将任务放入队列,然后在线程创建后启动这些任务,如果线程数量超过了最大数量,超出数量的线程排队等候,等其他线程执行完毕,在从队列中取出任务来执行

特点:

  • 降低资源消耗:通过重复利用已创建的线程降低线程创建和销毁造成的消耗

  • 提高响应速度:当任务到达时,任务可以不需要等待线程创建就能立即执行

  • 提高线程的可管理性:线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以统一的进行分配,调优和监控

  • Java中的线程池是通过Executor框架实现的,该框架中用到了Executor,Executors,ExecutorService,ThreadPoolExecutor这几个类

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NkCtbwP0-1692259785885)(C:\Users\asus\AppData\Roaming\Typora\typora-user-images\image-20230817142338684.png)]

二.使用方式和底层原理

//线程池常用三种创建方式
public class ThreadPoolDemo1 {

    public static void main(String[] args) {

        //一池五线程
//        ExecutorService threadPool1 = Executors.newFixedThreadPool(5);

        //一池一线程
//        ExecutorService threadPool2 = Executors.newSingleThreadExecutor();

        //一池可扩容线程
        ExecutorService threadPool3 = Executors.newCachedThreadPool();

        try {
            //10个顾客请求
            for (int i = 0; i < 10; i++) {

                //执行
                threadPool3.execute(() -> {
                    System.out.println(Thread.currentThread().getName() + "办理业务");
                });

            }

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //把线程池里的线程放回到线程池
            threadPool3.shutdown();
        }
    }


}

我们创建线程池,底层都是new ThreadPoolExecutor(...)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bEvBdjpW-1692259785886)(C:\Users\asus\AppData\Roaming\Typora\typora-user-images\image-20230817145125773.png)]

三.七个参数介绍

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AtkwrG2H-1692259785887)(C:\Users\asus\AppData\Roaming\Typora\typora-user-images\image-20230817150016389.png)]

四.工作流程和拒绝策略

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-84MxaUDv-1692259785887)(C:\Users\asus\AppData\Roaming\Typora\typora-user-images\image-20230817150602304.png)]

第一步,在主线程中执行了executor()方法后,线程才会创建

第二步,执行了executor方法后,线程池创建的所有线程分为常驻线程和非常驻线程,当任务来时,首先被常驻线程处理

第三步,当常驻线程用完了,此时再来的任务就会被放到阻塞队列中

第四步,当阻塞队列满了以后,再来的任务,就会启动新线程来处理

第五步,当达到最大线程数,而且阻塞队列也满了,这时又来了一个任务,那这个任务就会被拒绝

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-77I9vmQZ-1692259785888)(C:\Users\asus\AppData\Roaming\Typora\typora-user-images\image-20230817154934101.png)]

五.自定义线程池

//自定义线程池
public class ThreadPoolDemo2 {

    public static void main(String[] args) {
        ExecutorService threadPool = new ThreadPoolExecutor(
                2,
                5,
                2L,
                TimeUnit.SECONDS,
                new ArrayBlockingQueue<>(3),
                Executors.defaultThreadFactory(),
                new ThreadPoolExecutor.AbortPolicy()
        );
        try {
            //10个顾客请求
            for (int i = 0; i < 10; i++) {

                //执行
                threadPool.execute(() -> {
                    System.out.println(Thread.currentThread().getName() + "办理业务");
                });

            }

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //把线程池里的线程放回到线程池
            threadPool.shutdown();
        }
    }
}
ckTrace();
        } finally {
            //把线程池里的线程放回到线程池
            threadPool.shutdown();
        }
    }
}

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

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

相关文章

文件名称是递增的,删除掉其中一部分的文件,导致递增文件缺少,通过python查找出缺少的递增文件名称

文件名称是递增的&#xff0c;删除掉其中一部分的文件&#xff0c;导致递增文件缺少&#xff0c;通过python查找出缺少的递增文件名称 通过python,查找出缺少的递增的文件的名称&#xff1a; 代码如下&#xff1a; import osdef find_missing_numbers(folder_path):file_list …

6000万美元?通用汽车投资初创新贵Mitra,开发“经济型电池”

根据最新消息&#xff0c;通用汽车公司日前宣布领导一轮6000万美元的B轮融资&#xff0c;投资对象为电池材料初创公司Mitra Chem。此次投资旨在帮助通用汽车改进未来电动汽车的电池制造&#xff0c;使其更加经济实惠且易获取。 目前&#xff0c;大多数电池使用的是镍和钴的制造…

linux系统--makefile文件,gdb 以及文件描述符

目录 1 makefile 1.1 makefile的基本规则 1.2 makefile工作原理 1.3 makefile中的变量 1.4 makefile函数 1.5 makefile的清理操作 2 gdb调试 2.1 gdb介绍 2.2 生成调试信息 2.3 启动gdb 2.4 显示源代码 3文件IO 3.1 C库IO函数的工作流程 3.2 C库函数与系统函数的…

Sigmastar SSC8826Q 2K行车记录仪解决方案

一、方案描述 行车记录仪是智能辅助汽车驾驶&#xff0c;和管理行车生活的车联网智能终端设备&#xff0c;利用智能芯片处理器、GPS定位、网络通信、自动控制等技术&#xff0c;将与行车生活有关的各项数据有机地结合在一起。 行车记录仪如今已经成了必不可少的车载用品之一&…

用栈解决有效的括号匹配问题

//用数组实现栈 typedef char DataType; typedef struct stack {DataType* a;//动态数组int top;//栈顶int capacity; //容量 }ST;void STInit(ST*pst);//初始化void STDestroy(ST* pst);//销毁所有空间void STPush(ST* pst, DataType x);//插入数据到栈中void STPop(ST* pst);…

开学有什么平替电容笔值得买?比较好用的ipad手写笔

相信不少的学生党都已经在开学前入手了iPad&#xff0c;而现在&#xff0c;电容笔作为iPad的一种主要配件&#xff0c;其的性能也在不断地提高&#xff0c;使用电容笔的用户也在不断地增加。因此&#xff0c;如何挑选一款物美价廉的电容笔成为大家最关心的问题。那么&#xff0…

C/C++ : C/C++的详解,C语言与C++的常用算法以及算法的各自用法和应用(初级,中级),C++ CSP考题(J居多,S偏少)的详解,NOI的真题题解

目录 1.C语言 2.C 3.C与C语言的共同/不同点 4.导读 5.相关文章 5.1&#xff1a;Dev-C是Windows 环境下的一个轻量级 C/C 集成开发环境&#xff08;IDE&#xff09; 5.2&#xff1a;C是从C语言发展而来的&#xff0c;而C语言的历史可以追溯到1969年 6.C/C最新年度总…

java编译报错,get方法报错

java编译报错&#xff0c;get方法报错 处理方式&#xff1a; 在空间中&#xff0c;将 buid 文件夹删除 再不行的话&#xff0c;重启电脑&#xff0c;删除各种缓存 试试

Java请求Http接口-OkHttp(超详细-附带工具类)

简介&#xff1a;OkHttp是一个默认有效的HTTP客户端&#xff0c;有效地执行HTTP可以加快您的负载并节省带宽&#xff0c;如果您的服务有多个IP地址&#xff0c;如果第一次连接失败&#xff0c;OkHttp将尝试备用地址。这对于IPv4 IPv6和冗余数据中心中托管的服务是必需的。OkHt…

【boost网络库从青铜到王者】第五篇:asio网络编程中的同步读写的客户端和服务器示例

文章目录 1、简介2、客户端设计3、服务器设计3.1、session函数3.2、StartListen函数3、总体设计 4、效果测试5、遇到的问题5.1、服务器遇到的问题5.1.1、不用显示调用bind绑定和listen监听函数5.1.2、出现 Error occured!Error code : 10009 .Message: 提供的文件句柄无效。 [s…

docker限制容器日志大小

文章目录 业务场景问题排查彻底解决 业务场景 我们公司做交通相关业务&#xff0c;我们部门主要负责信控服务&#xff0c;卖信号机的硬件产品和配套的信控平台 由于有部分小项目&#xff0c;可能只有几十个路口&#xff0c;客户预算有限&#xff0c;只给我们老旧的Windows ser…

Google浏览器点击链接打开新标签页

由于新安装的谷歌浏览器点击链接时默认在当前窗口打开非常不方便&#xff0c;这里提供一下解决思路 1、打开浏览器输入任意内容&#xff0c;点击右上角的设置 2、在弹出的选项栏中点击See all Search settings 3、点击Other settings&#xff0c;将指定选项打开即可

数据结构——二叉搜索树

本章代码:二叉搜索树 文章目录 &#x1f332;1.二叉搜索树概念&#x1f333;2. 二叉搜索树操作&#x1f33f;2.1 结构定义&#x1f33f;2.2 插入操作&#x1f33f;2.3 查找操作&#x1f33f;2.4 删除操作&#x1f33f;2.5 遍历 &#x1f334;3. 二叉搜索树应用场景&#x1f340…

[JavaWeb]【五】web后端开发-Tomcat SpringBoot解析

目录 一 介绍Tomcat 二 基本使用 2.1 解压绿色版 2.2 启动TOMCAT 2.3 关闭TOMCAT 2.4 常见问题 2.5 修改端口号 2.6 部署应用程序 三 SpringBootWeb入门程序解析 前言&#xff1a;tomcat与SpringBoot解析 一 介绍Tomcat 二 基本使用 2.1 解压绿色版 2.2 启动TOMCAT 2…

作业day4

1.通过字符设备驱动分步注册方式编写LED灯的驱动&#xff0c;应用程序使用ioctl函数编写硬件控制逻辑 head.h #ifndef __HEAD_H__ #define __HEAD_H__ typedef struct {unsigned int MODER; unsigned int OTYPER; unsigned int OSPEEDR; unsigned int PUPDR; unsigned int …

主机防护的重要性和方式

01 主机防护的重要性 主机防护是网络安全的重要组成部分。在互联网时代&#xff0c;网络攻击成为了一种常见的威胁&#xff0c;而主机防护则是保护计算机系统免受网络攻击的重要手段。 主机防护可以防范各种网络攻击&#xff0c;如病毒、木马、黑客攻击等&#xff0c;从而保…

如何做好会员管理,有哪些好用的会员管理系统?

会员管理对于企业或中小商户来说非常重要&#xff0c;会员管理可以建立和维护与顾客之间的紧密关系&#xff0c;通过会员管理系统记录和分析会员的购买历史、偏好和行为&#xff0c;可以更好地了解他们的需求和兴趣&#xff0c;增加销售机会和满意度。 那么我们应该如何做好会员…

【深度学习 | 感知器 MLP(BP神经网络)】掌握感知的艺术: 感知器和MLP-BP如何革新神经网络

&#x1f935;‍♂️ 个人主页: AI_magician &#x1f4e1;主页地址&#xff1a; 作者简介&#xff1a;CSDN内容合伙人&#xff0c;全栈领域优质创作者。 &#x1f468;‍&#x1f4bb;景愿&#xff1a;旨在于能和更多的热爱计算机的伙伴一起成长&#xff01;&#xff01;&…

使用教程|CloudQuery: 数据库操作管控云平台初体验

&#x1f600;前言 前言&#xff1a;就在刚刚&#xff0c;在一个技术交流群里了解到了一场活动&#xff1a;CloudQuery 社区的有奖征文活动。除了有丰厚的礼物&#xff0c;使用过程中还有技术同学的支持。但是 CloudQuery 这个产品我也没有过多的了解&#xff0c;抱着对产品的好…

AndroidStudio升级Gradle之坑

最近在做旧工程的升级&#xff0c;原来的Gradle版本是4.6的&#xff0c;需要升级到7.6&#xff0c;JDK从8升级到17&#xff0c;一路淌了很多坑&#xff0c;逐个记录下吧 1、Maven仓库需要升级到https 你会遇到这个报错 Using insecure protocols with repositories, without …