关于线程池你了解些什么?

前言

学习线程池的思维导图


  1. 线程池是什么?它有什么用?

虽然线程比进程更轻量级,但是每个进程所占的资源空间是有限,如果我们频繁创建和销毁线程也会消耗很多CPU资源,那么我们该如何解决这个问题呢?

官方解释:线程池是一种多线程处理形式,其处理过程可以将多个任务添加到阻塞队列中,在创建线程后自动启动这些任务.简单来说,线程池就是提前准备好线程,我们创建线程可以直接在线程池中去拿,用完了还给线程池.这样会比从系统中申请更高效吗?答案是会的,因为我们直接从线程池中取线程是纯用户态(更及时一些)操作,而从系统申请涉及到内核态(不一定及时)的操作.通俗点来说,新开业的店一个人都没有,如果来一个客人雇一个员工去服务,服务完再解雇,重复雇佣再解雇会浪费大量时间,所以我们可以选择先规定一个固定员工人数,客人很多的时候,当店里没有达到固定员工人数再去雇佣人员,否则达到了固定员工人数,我们就将客人的信息记录下来,等哪个员工闲下来就让哪个员工去服务,如果是淡季没有什么客人来,就可以根据时间和客流量适当辞掉一部分员工,这样就提高了效率.


  1. 原装的线程池对象的构造

ThreadPoolExecutor类(原装线程池类),根据jdk文档我们选择参数最长的ThreadPoolExecutor构造方法,如下:

● corePoolSize 核心线程数 (固定线程数)

● maxmumPoolSize 最大线程数 (固定线程数+临时线程)

● keepAliveTime 不忙的时候,临时线程能存活的最大时间

● TimeUnit unit 不忙的时候,临时线程能存活最大时间的单位

● BlockingQueue<Runnable> workQueue 组织线程池任务的阻塞队列

● ThreadFactory threadFactory 创建线程的辅助类

● RejectedExecutionHandler handler 线程池的拒绝策略(线程池满了该如何拒绝?)

四种拒绝策略

① ThreadPoolExecutor.AbortPolicy 直接罢工抛异常

② ThreadPoolExecutor.CallerRunsPolicy 谁添加的任务谁执行

③ ThreadPoolExecutor.DiscardOldestPolicy 丢弃最老任务(阻塞队列队首任务)

④ ThreadPoolExecutor.DiscardPolicy 丢弃最新添加的这个任务


  1. 使用Executors类完成线程池的四种创建方式

Executors是一个工厂类,辅助线程池对象创建,它是ThreadPoolExecutor类(原装线程池类)的封装,我们使用它的四个类方法去实现线程池的创建.

① newFixedThreadPool() 方法创建的是固定线程数的线程池.

② newCachedThreadPool() 方法创建线程数目动态增长的线程池.

③ newSingleThreadExecutor() 方法创建只包含单个线程的线程池.

④ newScheduledThreadPool() 方法设定延迟时间后的执行命令,或者定期执行命令.

注:以ExecutorService es = Executors.四种方法 就能创建不同特点的线程池了.


  1. 如何实现一个固定线程数的线程池

class MyExecutorService {
    BlockingQueue<Runnable> queue = new LinkedBlockingQueue<>();

    public void submit(Runnable runnable) throws InterruptedException {
        queue.put(runnable);
    }

    public  MyExecutorService(int n) {
        for (int i = 0; i < n; i++) {
            Thread thread = new Thread(() -> {
                while (true) {
                    try {
                        Runnable runnable = queue.take();
                        runnable.run();
//                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            });
            thread.start();
        }
    }
}

public class ThreadDemoTest6 {
    static Object object = new Object();
    public static void main(String[] args) throws InterruptedException {

//        ExecutorService executorService = Executors.newFixedThreadPool(10);
//        executorService.submit(new Runnable() {
//            @Override
//            public void run() {
//                System.out.println();
//            }
//        });

        //简易实现:创建固定线程数为10个的线程池
        MyExecutorService service = new MyExecutorService(10);
        for (int i = 0; i < 1000; i++) {
            int num = i;
            service.submit(new Runnable() {
                @Override
                public void run() {
                    System.out.println(num);
                }
            });
        }
    }
}

一千个任务由固定十个线程去完成,而不是创建一千个线程去执行对应一个任务.节省了创建和销毁线程.

注:这里没有实现工厂模式,工厂模式用于解决构造方法带来的问题(一个类中,两种或多种构造方法的实现不同,但是参数相同),工厂模式就单独实现一个工厂类,去实现静态的普通方法去辅助对象的构造.


分享完毕~

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

电子招标采购系统:营造全面规范安全的电子招投标环境,促进招投标市场健康可持续发展

营造全面规范安全的电子招投标环境&#xff0c;促进招投标市场健康可持续发展 传统采购模式面临的挑战 一、立项管理 1、招标立项申请 功能点&#xff1a;招标类项目立项申请入口&#xff0c;用户可以保存为草稿&#xff0c;提交。 2、非招标立项申请 功能点&#xff1a;非招标…

Google巨大漏洞让Win10、11翻车,小姐姐马赛克白打了

早年间电脑截图这项技能未被大多数人掌握时&#xff0c;许多人应该都使用过手机拍屏幕这个原始的方式。 但由于较低的画面质量极其影响其他用户的观感&#xff0c;常常受到大家的调侃。 但到了 Win10、11 &#xff0c;预装的截图工具让门槛大幅降低。 WinShiftS 就能快速打开…

专业护眼灯什么牌子好?分享最专业护眼灯品牌排行

在日常生活中&#xff0c;照明灯具为人们提供了很多便利&#xff0c;但是对于长时间在灯光下用眼的学生跟办公族来说&#xff0c;容易导致用眼疲劳&#xff0c;甚至头晕等现象&#xff0c;所以现在普遍许多家庭都必备有护眼灯&#xff0c;能对眼睛起到缓解疲劳的作用&#xff0…

Docker安装Mysql集群(主从复制)

Docker安装Mysql集群(主从复制) 配置阿里云镜像 sudo vim /etc/docker/daemon.json插入如下镜像 {"registry-mirrors": ["https://sdiz8d27.mirror.aliyuncs.com"] }重启docker sudo systemctl daemon-reloadsudo systemctl restart docker保证images有…

python

好处 相对其他编程语言 比较简洁丰富的第三方库【做爬虫、机器学习、深度学习】 numpypandasmatplotlit用处 数据分析web开发游戏开发AI【比较广泛】安装部署python环境 1.官网下载python安装包【原生部署】 官网&#xff1a;python.org2.安装anaconda 1.自带python环境2.有丰富…

Mybatis-Plus进阶使用

一、逻辑删除 曾经我们写的删除代码都是物理删除。 逻辑删除&#xff1a;删除转变为更新 update user set deleted1 where id 1 and deleted0 查找: 追加 where 条件过滤掉已删除数据,如果使用 wrapper.entity 生成的 where 条件也会自动追加该字段 查找: select id,name,dele…

JConsole使用教程

JConsole是一个Java虚拟机的监控和管理工具&#xff0c;可以监控Java应用程序的内存使用、线程和类信息等。 以下是JConsole的使用教程&#xff1a; 1.启动JConsole JConsole是一个Java自带的工具&#xff0c;可以在bin目录下找到jconsole.exe文件。双击运行该文件即可启动JC…

正则表达式-元字符

文章目录一、正则表达式-元字符总结一、正则表达式-元字符 正则表达式 - 元字符 下表包含了元字符的完整列表以及它们在正则表达式上下文中的行为&#xff1a; 字符描述\将下一个字符标记为一个特殊字符、或一个原义字符、或一个 向后引用、或一个八进制转义符。例如&#xf…

强人工智能时代,区块链还有戏吗?

最近很多人都在问我&#xff0c;ChatGPT 把 AI 又带火了&#xff0c;区块链和 Web3 被抢了风头&#xff0c;以后还有戏吗&#xff1f;还有比较了解我的朋友问&#xff0c;当年你放弃 AI 而选择区块链&#xff0c;有没有后悔&#xff1f;这里有一个小背景。2017 年初我离开 IBM …

银行数字化转型导师坚鹏:如何制定银行数字化转型年度培训规划

如何制定银行数字化转型年度培训规划 ——以推动银行数字化转型战略落地为核心&#xff0c;实现知行果合一课程背景&#xff1a; 很多银行都在开展银行数字化转型培训工作&#xff0c;目前存在以下问题急需解决&#xff1a; 缺少针对性的银行数字化转型年度培训规划 不清楚如…

Spring --- 声明式事务

一、JdbcTemplate 1.1、简介 Spring 框架对 JDBC 进行封装&#xff0c;使用 JdbcTemplate 方便实现对数据库操作 1.2、准备工作 ① 加入依赖 <dependencies><!-- 基于Maven依赖传递性&#xff0c;导入spring-context依赖即可导入当前所需所有jar包 --><depen…

openAi ChatGPT调用性能优化的一些小妙招

参考的demo:GitHub - ddiu8081/chatgpt-demo: A demo repo based on OpenAI API. 扭曲调教&#xff1a; openai提供的chat接口&#xff08;https://api.openai.com/v1/chat/completions&#xff09;由于其模型很大&#xff08;什么1750亿个参数啥的&#xff09;&#xff0c;单…

Redis之底层数据结构

一 Redis数据结构 Redis底层数据结构有三层意思&#xff1a; 从Redis本身数据存储的结构层面来看&#xff0c;Redis数据结构是一个HashMap。从使用者角度来看&#xff0c;Redis的数据结构是String&#xff0c;List&#xff0c;Hash&#xff0c;Set&#xff0c;Sorted Set。从…

Docker 镜像使用

目录 1、列出镜像列表 2、获取一个新的镜像 3、查找镜像 4、拖取镜像 5、删除镜像 6、创建镜像 a.更新镜像 b.构建镜像 设置镜像标签 当运行容器时&#xff0c;使用的镜像如果在本地中不存在&#xff0c;docker 就会自动从 docker 镜像仓库中下载&#xff0c;默认是从 …

现在大专生转IT可行吗?

当然可行的。 大专也是人&#xff0c;为什么不可以选择喜欢的专业学习&#xff0c;现在大学生遍地都是&#xff0c;学历已经不是限制你发展的因素了。有的人就是不擅长理论学习&#xff0c;更喜欢技术。IT也只是一个普普通通的技术行业&#xff0c;跟其他技术行业一样&#xf…

wsl=

安装wsl wsl --install,用户名wu,密码 123456&#xff0c; https://learn.microsoft.com/en-us/windows/wsl/install 安装anaconda, 把anaconda移动到wu目录下&#xff0c;在wu用户以及用户目录下执行bash Anaconda-文件名&#xff0c;安装目录为/home/wu/anaconda3 配置cond…

C#方法详解

总目录 文章目录总目录前言一、方法概述1、方法签名2、调用/访问方法/方法形参与实参二、扩展方法1.实现扩展方法2、扩展方法调用3、优先级问题4、其他扩展方法示例1.获得枚举的Description2.其他常用扩展方法三、方法参数列表详解1、可选自变量&#xff08;可选参数&#xff0…

深入剖析 MVC 模式与三层架构

文章目录1. 前言2. MVC模式3. 三层架构4. MVC和三层架构5. 总结5.1 IDEA 小技巧1. 前言 前面我们探讨了 JSP 的使用&#xff0c;随着计算机技术的不断更新迭代&#xff0c;JSP 的技术由于存在很多的缺点&#xff0c;已经逐渐退出了历史的舞台&#xff0c;所以在学习时&#xf…

Google代码覆盖率最佳实践

软件质量保障: 所寫即所思&#xff5c;一个阿里质量人对测试的所感所悟。谷歌一直倡导的领域之一是使用代码覆盖率数据评估风险并识别测试中的真空。然而&#xff0c;代码覆盖率的价值一直是个争议的话题。每次聊到代码覆盖率时&#xff0c;似乎都会引发无尽的争论。由于大家固…

88、K-Planes: Explicit Radiance Fields in Space, Time, and Appearance

简介 主页&#xff1a;https://sarafridov.github.io/K-Planes/ 图像使用一个平面表示&#xff0c;静态三维场景用三个平面表示&#xff0c;后续动态场景用三个平面加一维时间 t 表示&#xff0c;论文提出使用六个平面表示动静态场景&#xff0c;即静态场景占三个平面&#x…