【JAVA入门】Day48 - 线程池

news2024/9/21 3:33:32

【JAVA入门】Day48 - 线程池


文章目录

  • 【JAVA入门】Day48 - 线程池
    • 一、线程池的主要核心原理
    • 二、自定义线程池
    • 三、线程池的大小


        我们之前写的代码都是,用到线程的时候再创建,用完之后线程也就消失了,实际上这是不对的,它会浪费计算机的内存和运算资源。
        线程池的出现就是为了解决这个问题,线程池在收到任务后,会派出一个空闲线程进行处理,处理完毕后,该线程又会回到线程池;如果没处理完时又来了新的任务,那么它就再派出一个线程进行处理,但最后,所有的线程都会再次回到线程池,没有产生任何浪费。
        线程池虽然方便,但也是有上限的,这个上限可以由我们自己设置,如果提交任务时池子里没有空闲线程,剩下的线程只能在外等待。

一、线程池的主要核心原理

① 创建一个池子,池子中是空的。
② 提交任务时,池子会创建新的线程对象,任务执行完毕,线程归还给池子。下次再提交任务时,不需要创建新的线程,直接复用已有的线程即可。
③ 如果提交任务时,池子中没有空闲线程,也无法创建新的线程,任务就会排队等待。

如果要用代码创建线程池,我们需要用到一个新的工具类——Executors。
在这里插入图片描述

代码实现如下:

package ExecutorsDemos;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class MyThreadPoolDemo {
    public static void main(String[] args) {
        /*
            public static ExecutorService newCachedThreadPool()                     创建一个没有上限的线程池
            public static ExecutorService newFixedThreadPool(int nThreads)          创建一个上限为nThreads的线程池
         */

        //1.获取线程池对象
        ExecutorService pool1 = Executors.newCachedThreadPool();

        //2.提交任务
        pool1.submit(new MyRunnable());
        pool1.submit(new MyRunnable());
        pool1.submit(new MyRunnable());
        pool1.submit(new MyRunnable());
        pool1.submit(new MyRunnable());

        //3.销毁线程池
        //pool1.shutdown();

        //4.创建一个有上限的线程池
        ExecutorService pool2 = Executors.newFixedThreadPool(3);
      
    }
}

二、自定义线程池

        线程池创建的构造方法 ThreadPoolExecutor() 最多可达7个参数。如果将线程池比作经营饭店,那么这七个参数对应下面七种要素。
在这里插入图片描述
        自定义线程池的运行情况和你提交的任务数量有关,假设有一个自定义线程池,核心线程有3个,临时线程有3个,现在根据不同任务数量进行处理。
1.提交3个任务,线程池只需动用3个核心线程分别执行即可。
在这里插入图片描述

2.提交5个任务时,此时前3个任务分别被3个核心线程包揽,但是剩下两个任务并没有核心线程可以支持,这时候线程池却不创建临时线程来干活,因此后2个任务只能排队等待。

在这里插入图片描述
3.提交8个任务时,此时前3个任务被3个核心线程包揽,然后剩下3个任务去队列里排队,把长度为3的队列也占满了,此时还有2个任务没有去处,这个时候线程池才会创建2个临时线程来处理任务七和任务八。
在这里插入图片描述
由这个案例可以知道,先提交的任务不一定优先执行。
4.提交10个任务时,前3个任务被3个核心线程包揽,后3个任务被放入队伍排队,再3个任务被临时线程包揽,此时还剩1个任务,此时这个任务没有线程可以处理,只能触发任务拒绝策略。

在这里插入图片描述
Java 中默认的策略就是:丢弃任务并抛出异常,其他三个策略了解一下就行。
在这里插入图片描述

        自定义线程池的构造方法代码实现如下所示:

package ExecutorsDemos;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class ThreadPoolExecutorDemo1 {
    /*
        ThreadPoolExecutor
        参数一:核心线程数量
        不能小于0
        参数二:最大线程数
        不能小于等于0,最大数量>=核心线程数量
        参数三:空闲线程最大存活时间
        不能小于0
        参数四:时间单位
        用TimeUnit指定
        参数五:任务队列
        不能为null
        参数六:创建线程工厂
        不能为null
        参数七:任务的拒绝策略
        不能为null
     */
    public static void main(String[] args) {
        ThreadPoolExecutor pool = new ThreadPoolExecutor(
                3, //核心线程数量,不能小于0
                6,  //最大线程数,不能小于0,最大数量 >= 核心线程数
                60,  //空闲线程最大存活时间
                TimeUnit.SECONDS,   //时间单位,这里是一个常量"秒"
                new ArrayBlockingQueue<>(3),    //阻塞队列,长度为3
                Executors.defaultThreadFactory(),     //创建线程工厂
                new ThreadPoolExecutor.AbortPolicy()  //任务的拒绝策略,它是一个内部类
        );
    }
}

三、线程池的大小

        线程池多大合适呢?这个我们一般有专门的公式。
在这里插入图片描述
        一个4核8线程的CPU,最大并行数是8。
在这里插入图片描述

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

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

相关文章

【源码+文档+调试讲解】健身房管理平台小程序

摘 要 随着健康意识的增强和移动互联网技术的普及&#xff0c;健身房管理平台小程序应运而生&#xff0c;为健身爱好者提供便捷的健身服务和管理。本设计针对传统健身房会员管理混乱、课程预约不便利、用户互动缺乏等问题&#xff0c;开发了一款集教练、预约教练、会员、健身…

正也科技-辖区与指标管理系统 强化决策支持

正也科技的“辖区与指标管理系统”设计理念先进&#xff0c;旨在通过科学合理的组织架构和精细化的指标管理&#xff0c;帮助企业实现更高效的市场布局、人员配置及业绩监控。以下是对该系统核心功能的进一步阐述及其对企业运营带来的优势&#xff1a; 正也科技辖区管理 1. 组…

基于SpringBoot+Vue+MySQL的社区医院管理系统

系统展示 系统背景 在当前医疗体系日益完善的背景下&#xff0c;社区医院作为基层医疗服务的重要一环&#xff0c;其管理效率和服务质量直接关系到居民的健康福祉。为了提升社区医院的管理水平&#xff0c;优化患者就医体验&#xff0c;我们设计了一套基于SpringBoot、Vue.js与…

深兰科技荣获“2024年度人工智能最具商业合作价值企业”奖

9月19日&#xff0c;以“释放AI应用价值&#xff0c;发展新质生产力”为主题的“AIAC2024人工智能应用大会”在北京隆重举行。大会揭晓了“AI卓智奖”年度人工智能创新评选的获奖榜单&#xff0c;深兰科技荣获“2024年度人工智能最具商业合作价值企业”称号&#xff0c;同时&am…

【高分系列卫星简介——高分一号(GF-1)】

高分一号卫星&#xff08;GF-1&#xff09; 高分一号&#xff08;GF-1&#xff09;是中国高分辨率对地观测系统&#xff08;简称“高分专项”&#xff09;的第一颗卫星&#xff0c;具有里程碑式的意义。以下是对高分一号卫星的详细介绍&#xff1a; 一、基本信息 发射时间&…

标签云效果

产品要求&#xff0c;词云要实现动态滚动。查资料&#xff0c;改写效果。 echarts词云效果 传统的echarts-wordCloud不能满足需求。 标签云 换了标签云&#xff0c;以下是代码 <template><div class"mx-auto" :style"{ width: width px }"&g…

平凉锅盔,真的绝绝子

平凉&#xff0c;这座古老的城市&#xff0c;孕育出了一种令人赞叹的美食 —— 平凉锅盔。平凉锅盔&#xff0c;那是一种能瞬间勾起人们食欲的存在。远远望去&#xff0c;它如同一座金色的小山&#xff0c;散发着诱人的光泽。其外形圆润饱满&#xff0c;厚实的面饼给人一种踏实…

时代变了,MySQL 早已不是最流行的数据库了

以下文章来源于古时的风筝 &#xff0c;作者风筝 在StackOverflow 上看到2024年技术趋势&#xff0c;关于数据库的部分&#xff0c;PostgreSQL 是开发人员使用最多的数据库&#xff0c;超过 MySQL 了。虽然在国内好像不是这样。 PostgreSQL 在 2018 年的开发者调查中首次亮相…

极越联手百度这你受得了吗!SU7还能稳坐“7字辈”头把交椅?

文/王俣祺 导语&#xff1a;自从今年上半年小米SU7标榜为“年轻人的第一台纯电轿车”&#xff0c;各家车企全都坐不住了。尤其是与小米“颇有渊源”的吉利&#xff0c;从极氪再到领克&#xff0c;目标已经可以说是路人皆知了。现在极越07也来了&#xff0c;可以看出吉利也是下了…

Python游戏开发中的16个关键概念

大家好&#xff01;今天我们要聊的是Python游戏开发中的一些关键概念。无论是初学者还是有一定经验的开发者&#xff0c;了解这些概念都将有助于你更好地掌握游戏开发的基础。接下来&#xff0c;我们将从简单的概念入手&#xff0c;逐步过渡到更复杂的技巧。 文末有惊喜福利 1.…

如何选择适合客户运营团队的帮助中心搭建工具?8款工具盘点

在竞争激烈的商业环境中&#xff0c;客户运营团队需要高效、便捷的工具来搭建帮助中心&#xff0c;以提升客户服务质量和用户体验。选择合适的帮助中心搭建工具&#xff0c;不仅能提高团队工作效率&#xff0c;还能增强客户满意度和忠诚度。本文将为您盘点八款适合客户运营团队…

FC优化配置

1.集群扩容CNA时打开bmc 2.给rhel7虚拟机安装tools-需要重启虚拟机 3.FC上创建集群 资源池右击创建集群&#xff08;物理机大于10台&#xff0c;分业务类型创建集群&#xff09; &#xff08;解决集群内主机挂了&#xff0c;动态调整&#xff09; &#xff08;解决集群内个别…

vulnhub(11):derpnstink(hydra爆破用户名和密码、验证的文件上传)

端口 nmap主机发现 nmap -sn 192.168.159.120/24 ​ Nmap scan report for 192.168.159.120 Host is up (0.00020s latency). ​ 120是新出现的机器&#xff0c;他就是靶机 nmap端口扫描 nmap -Pn 192.168.159.120 -p- --min-rate 10000 -oA nmap/scan 扫描开放端口保存到 nma…

C#为任意组件开发登录功能的记录

非常简单&#xff0c;直接给出代码&#xff1a; 数据库操作类 这个无需多言就是简单的包含了数据操作的内容&#xff0c;允许你在这一个类中写完关于本地数据库或者云数据库操作的逻辑&#xff0c;与登录逻辑分开哦。 注意&#xff0c;如果你的软件要给别人运行使用&#xf…

电脑连接手机热点只能登陆qq和微信 浏览器无法正常上网的原因

电脑连接手机热点只能登陆qq和微信 浏览器无法正常上网的原因 浏览器有报错dns错误 但是火绒无法正常修复 DNS配置异常 chrome报错DNS_PROBE_FINISHED_BAD_CONFIG 错误原因在ipv4dns服务器他的地址,如果是自动获取 是192.168.208.143 和ipv4地址冲突,导致不正常,我查看本机…

【南方科技大学】CS315 Computer Security 【Lab3 Format String Vulnerability】

目录 Lab OverviewLab TasksTask 1: The Vulnerable ProgramTask 2: Understanding the Layout of the StackTask 3: Crash the ProgramTask 4: Print Out the Server Program’s MemoryTask 5: Change the Server Program’s MemoryTask 6: Inject Malicious Code into the Se…

【第十一章:Sentosa_DSML社区版-机器学习分类】

目录 11.1 逻辑回归分类 11.2 决策树分类 11.3 梯度提升决策树分类 11.4 XGBoost分类 11.5 随机森林分类 11.6 朴素贝叶斯分类 11.7 支持向量机分类 11.8 多层感知机分类 11.9 LightGBM分类 11.10 因子分解机分类 11.11 AdaBoost分类 11.12 KNN分类 【第十一章&…

С++第十三节课 string初体验

一、string类的相关函数 string实际上也就是一个管理字符的顺序表&#xff01; 如果我们需要遍历一个字符串&#xff0c;怎么实现&#xff1f; 我们可以通过下标访问操作符 size实现字符串的遍历&#xff01; int main() {string s1("hello world");// 遍历一个字…

玩具车检测系统源码分享

玩具车检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Visio…

zynq SDK 关于SD卡报错

在修改了BD的部分代码之后&#xff0c;重新综合工程生成bit&#xff0c;之后刷新hdf文件&#xff0c;在SDK端就出现了SD卡相关的函数未定义的报错&#xff1a; Description Resource Path Location Type E:\Work\VivadoPrj\Prj1\project_1\project_1.sdk\Test\Debug/…/src/hel…