JavaEE初阶---多线程(五)---定时器/线程池介绍

news2024/11/22 13:30:20

文章目录

  • 1.定时器的介绍
  • 2.线程池
    • 2.1为什么需要使用线程池
    • 2.2如何进行线程池的创建
    • 2.3普通的构造方法的局限性
    • 2.4该种对象创建的方法的特点
    • 2.5线程池的模拟实现的逻辑
  • 3.ThreadPoolExecutor类的介绍
    • 3.1构造方法
    • 3.2四种拒绝的策略

1.定时器的介绍

下面的这个就是我们的这个定时器的使用:

首先,我们为什么需要了解这个定时器:定时器其实就是约定一个时间,时间到达之后,我们就会执行某一个代码的逻辑,其实这个定时器非常常见,尤其是进行这个网络之间的通信的时候;

例如一个真实的情况下,我们的这个客户端和服务器端进行交互,我们的这个客户端发出去了请求,但是我们的这个服务器迟迟没有进行响应,这个时候我们是不知道这个问题出现你在什么地方的,可能是这个请求没有发过去,也可能是发过去但是这个相应丢失了,也可能是这个服务器出问题了;

对于我们的这个客户端而言,不可能会无限地进行等待,这个等待需要一个时间的最大的限制:就是我们等到一定的时间之后就不会继续进行等待,这个等待的时间就是通过这个定时器的方式进行实现的;

就是我们的这个程序的执行的时刻,以基准时间作为参照,然后查看我们的这个线程任务什么时候会被执行

image-20241026180236470

上面的这个其实我们使用的就是这个schedule方法,这个方法里面其实是由两个参数的的,第一个就是我们的这个匿名内部类,这个类是继承自我们的这个TimerTask父类,并且对于这个父类里面的这个run方法进行重写,我们的这个方法的第二个参数就是我们的程序的这个delay的时间,即从当前时间开始计时我们的这个任务在什么时间会被执行;

我们上面是写了三个任务,分别是100,200,3000ms的时间之后分别进行任务的执行,因此这个就是经过1000ms之后,这个第三个程序就会被执行,然后就是我们的2000ms的,最后就是这个1000ms的,因此虽然我们的第一个程序在这个代码里面的位置是第一个,但是这个程序是最后才执行的;

定时器的整体实现逻辑:

  • 定义出来一个类,对于这个需要执行的任务进行描述;
  • 创建优先级队列,组织所有的执行的任务,设置时间看看哪一个任务需要先被执行,哪一个是后被执行的;
  • 扫描线程,判断这个队首元素是不是可以执行任务;(这个地方为什么需要进行判断,主要就是这个队列里面的这个队首的这个元素,其实就是线程是不是可以去执行任务,因为这个线程的执行可能会有先决条件,或者叫做前置条件,因此我们需要扫描判断这个队列里面的第一个线程是不是可以去执行这个任务)

2.线程池

2.1为什么需要使用线程池

这个线程出现的目的就是为了简化这个进程的开销,因此我们的这个线程又被称为轻量化进程,但是当我们的这个线程的数量很多的时候,我们的这个效率其实是有待提高的,这个就是我们要了解学习的这个线程池

如何正确理解线程池:就是我们在操控这个线程1的时候,线程2,3,4等等诸多线程就会已经被创建出来,这样的好处就是我们想要使用线程的时候,不用进行线程的创建,而是直接从这个线程池里面取出来线程;(这个时候创建线程的开销就被降低了);

为什么直接从这个池子里面去出来线程,比我们创建新的线程的效率更高?—因为我们的这个线程池是存粹的用户态的操作,而我们如果去创建新的线程,这个时候就需要可能调用这个系统的方法,因此这个创建新的线程就是用户态和内核态的操作,因此相比之下,我们自己对于这个线程的操控远比这个内核态+用户态的效率更加高效

这个就是我们的线程池的效率更加高效的原因!!!!

2.2如何进行线程池的创建

我们的这个线程池的创建不是使用这个普通的new方法去创建的,而是调用这个系统的方法去返回一个线程池的对象

下面的这个展示的就是三种创建的方式:

第一个就是创建一个普通的线程池,第二个是创建一个线程冲,但是对于这个线程池里面的这个线程的数量进行了指定,第三个就是创建一个只包含了一个线程的线程池;

image-20241026212008311

相比于这个普通的构造方法的局限性,我们上面的这个使用方法的返回值创建的这个线程池的思路其实就是大名鼎鼎的设计模式----工厂模式;

2.3普通的构造方法的局限性

我们的这个普通的构造方法的局限性:我们的这个构造方法要求我们的这个方法的名字必须要是一样的,如果想要实现不同的构造方法需要通过这个不同的重载的方式进行这个区分;

但是我们很多时候,创建对象的时候,需要多种构造的方式,这个多种方式需要我们使用多个版本的构造方法去实现,因此我们使用这个方法的调用去返回这个线程池的对象,这个就是工厂模式的一个特点;

工厂模式是给这个构造方法填坑的;

2.4该种对象创建的方法的特点

ExecutorService service= Executors.newCachedThreadPool();

在这个创建方式之下,我们的线程池里面的这个线程的数量是可以进行动态的调整的—这个是这个方式的一个基本的特点;

就是我们的这个线程池里面随着这个线程的任务的增加,我们的这个线程池里面的这个线程就会被根据需要自动的创建出来;

创建出来这个线程也不会着急销毁,会在这个池子里面被保留一段时间,以备我们的随时使用;这个主要就是这个方法里面的这个cache缓存,就是用过之后不会很着急的释放,方便后续的使用;

2.5线程池的模拟实现的逻辑

  • 创建消息队列;
  • 通过submit方法把我们的这个任务添加到这个消息队列里面去;
  • 创建出来线程,并且去执行这个队列里面的任务;

3.ThreadPoolExecutor类的介绍

这个类是干什么的,其实我们上面介绍的三个创建线程池的方法,底层都是对于这个ThreadPoolExecutor这个类进行的封装,这个类里面有很多你的这个功能,有很多的参数,标准库里面的工厂方法其实就是让这个类填充不同的参数达到的不同的效果;

3.1构造方法

下面的这个就是我们的这个类里面的很常见的构造方法:

其中这个官方文档里面的这个第四个构造方法的参数是最全面的,我们就以这个第四个进行介绍;

image-20241026213558612

corePoolSize就是指的这个核心的线程数量

maxinumPoolSize表示的就是这个最多的线程数量

我们的这个线程池里面的这个线程的数量可以进行这个动态的调整,但是这个数量必须要介于这个核心线程数量和这个最大线程数量之间;

keepAliveSize表示的就是这个最大的线程数量的存活的时间,其中这个后面的这个unit就是我们的这个存活时间的单位;

blockingquene就是一个阻塞队列,作用就是用来存储这个线程池里面的这个线程任务(我们的这个地方的队列可以使用优先级队列,也可以不使用优先级队列);

threadFactory就是这个工厂类,也是我们的工厂模式的体现,这个工厂类负责线程的创建,使用工厂类去创建线程,主要是想要在这个线程的创建过程中,对于这个线程的属性进行相应的控制;

handled这个参数就是线程池的拒绝策略,就是我们的这个线程池里面的这个线程的数量已经都达到了这个maxnum了,这个时候我们还是往这个线程池里面去添加线程,这个时候就会被线程池拒绝;

3.2四种拒绝的策略

1.直接抛出来一场进行处理;

2.添加的这个新的任务,由这个添加任务的这个线程自己负责执行;

3.丢弃我们的这个任务队列里面的这个最老的一个任务;

4.丢弃当前的这个新被添加进来的任务;

image-20241026214604106
这个线程自己负责执行;

3.丢弃我们的这个任务队列里面的这个最老的一个任务;

4.丢弃当前的这个新被添加进来的任务;

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

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

相关文章

基于JSP的高校食堂食材选购管理系统【附源码】

基于JSP的高校食堂食材选购管理系统 效果如下: 系统首页界面 用户登录页面 食材信息页面 论坛交流界面 管理员登录界面 管理员功能主界面 食材信息管理界面 订单配送管理界面 用户功能主界面 商家功能主界面 司机功能主界面 研究背景 近年来互联网技术的发展使得…

【C++篇】手撕string类:从初级到高级入门

1.为什么手撕string类 在面试或者一些学习场景中,手撕 string 类不仅仅是对字符串操作的考察,更多的是考察程序员对 C 内存管理的理解。例如,深拷贝与浅拷贝的实现,如何正确重载赋值运算符,如何避免内存泄漏&#xff…

线上环境的 JAVA 程序占用太多 CPU 资源,定位原因

线上环境的 JAVA 程序占用太多 CPU 资源,定位原因 top 命令执行显示一下结果 我们可以看到有一个 PID 是 4054 的应用程占用了超过一半的 CPU 资源,这是十分糟糕的事情,这个时候我们首先定位一下他是哪个线程在这里搞事情,这个时…

【JavaSE】认识String类,了解,进阶到熟练掌握

#1024程序员节 | 征文# 下面就让博主带领大家一起解决心中关于String类的疑问吧~~~ 1.字符串构造: 第一种和第二种(有一定的区别,在常量池上) public static void main(String[] args) { // 使用常量串构造 String s1 "h…

【机器学习】——numpy教程

文章目录 1.numpy简介2.初始化numpy3.ndarry的使用3.1numpy的属性3.2numpy的形状3.3ndarray的类型 4numpy生成数组的方法4.1生成0和1数组4.2从现有的数组生成4.3生成固定范围的数组4.4生成随机数组 5.数组的索引、切片6.数组的形状修改7.数组的类型修改8.数组的去重9.ndarray的…

【Visual Studio】下载安装 Visual Studio Community 并配置 C++ 桌面开发环境的图文教程

引言 Visual Studio 是一个面向 .NET 和 C 开发人员的综合性 Windows 版 IDE,可用于构建 Web、云、桌面、移动应用、服务和游戏。 安装步骤 访问 Visual Studio 的官方下载页面: https://visualstudio.microsoft.com/zh-hans/downloads/运行已下载的 V…

java疫苗发布和接种预约系统源码(springboot)

项目简介 疫苗发布和接种预约系统实现了以下功能: 疫苗发布和接种预约系统的主要使用者分为: 管理员对公告信息,医院信息,疫苗信息,医生信息,用户信息,论坛帖子信息以及预约接种信息等信息进行…

ThinkPad T480拆机屏幕改装:便携式显示器DIY指南

ThinkPad T480拆机屏幕改装:便携式显示器DIY指南 本文记录了将旧笔记本电脑 T480 拆机屏幕改装为便携式显示器的全过程。作者在决定升级设备后,选择通过 DIY 方式利用原有的屏幕资源。文章详细介绍了屏幕驱动板的安装、螺丝孔的剪裁、排线连接及固定的步…

系统性能优化——绑核

简要 绑核正如其名,将线程/进程绑定在一个或多个CPU核心。该技术可以使进程或线程在特定的处理器上运行,而不会被操作系统调度到其他处理器上。这里有两层含义。 如果线程被绑定在指定核心上,则只会在该核心上运行,即使其他核心…

Django自定义过滤器

一、介绍 Django过滤器是一种用于在Django模板中处理数据的技术。它们的主要作用是对模板中的变量进行加工、过滤或格式化,然后返回一个新的值供模板使用。这些过滤器可以在变量输出时,对输出的变量值做进一步的处理,以满足特定的显示需求。…

C# 串口通信教程

串口通信(Serial Communication)是一种用于设备之间数据传输的常见方法,通常用于与外部硬件设备(如传感器、机器人、微控制器)进行通信。在 C# 中,System.IO.Ports 命名空间提供了与串口设备交互的功能&…

Golang | Leetcode Golang题解之第508题出现次数最多的子树元素和

题目: 题解: func findFrequentTreeSum(root *TreeNode) (ans []int) {cnt : map[int]int{}maxCnt : 0var dfs func(*TreeNode) intdfs func(node *TreeNode) int {if node nil {return 0}sum : node.Val dfs(node.Left) dfs(node.Right)cnt[sum]if…

数字后端零基础入门系列 | Innovus零基础LAB学习Day6

今天没有具体的数字IC后端lab实验。今天的重点是熟悉掌握静态时序分析STA中的几类timing path以及setup和hold检查机制(包含setup和hold计算公式)。 芯片流片失败的那些故事 数字后端零基础入门系列 | Innovus零基础LAB学习Day5 等大家把今天内容学习…

设计模式(二)工厂模式详解

设计模式(二)工厂模式详解 简单工厂模式指由一个工厂对象来创建实例,适用于工厂类负责创建对象较少的情况。例子:Spring 中的 BeanFactory 使用简单工厂模式,产生 Bean 对象。 工厂模式简介 定义:工厂模式是一种创建…

Spring Boot框架下中小企业设备管理系统开发

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及,互联网成为人们查找信息的重要场所,二十一世纪是信息的时代,所以信息的管理显得特别重要。因此,使用计算机来管理中小企业设备管理系统的相关信息成为必然。…

Kafka-代码示例

一、构建开发环境 File > New > Project 选择一个最简单的模板 项目和坐标命名 配置maven路径 添加maven依赖 <dependencies><!-- https://mvnrepository.com/artifact/org.apache.kafka/kafka-clients --><dependency><groupId>org.apache.kaf…

最长子序列模型二(二分优化版)

文章目录 提高课题解一、拦截导弹二、导弹防御系统三、最长公共上升子序列四、二分函数速写 基础课题解五、最长上升子序列 II 提高课题解 一、拦截导弹 题目链接 第一问非常简单&#xff0c;直接用之前最长上身子序列模板就行 第二问就有难度了&#xff0c;我们要用最少的递…

基于SSM“毛毛宠物店”宠物信息交流平台的设计与实现

开发说明 开发语言&#xff1a;Java 框架&#xff1a;ssm 技术&#xff1a;JSP JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09; 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myec…

DEV-C++如何调试

1、先编译&#xff0c;再点击“调试”按钮 2、使用调试按钮&#xff0c;可以输入输出数据 第21次发博客 以后会慢慢更新

【计网】从零开始认识IP协议 --- 认识网络层,认识IP报头结构

从零开始认识IP协议 1 网络层协议1.1 初步认识IP协议1.2 初步理解IP地址 2 IP协议报头3 初步理解网段划分 1 网络层协议 1.1 初步认识IP协议 我们已经熟悉了传输层中的UDP和TCP协议&#xff0c;接下来我们来接触网络层的协议&#xff1a; 网络层在计算机网络中的意义主要体现…