Java多线程的线程状态和线程池参数

一、线程状态

当线程被创建并启动以后,它既不是一启动就进入了执行状态,也不是一直处于执行状态。线程对象在不同的时期有不同的状态。Java中的线程状态被定义在了java.lang.Thread.State枚举类中,State枚举类的源码如下:

public class Thread {public enum State {/* 新建 */NEW , /* 可运行状态 */RUNNABLE , /* 阻塞状态 */BLOCKED , /* 无限等待状态 */WAITING , /* 计时等待 */TIMED_WAITING , /* 终止 */TERMINATED;}// 获取当前线程的状态public State getState() {return jdk.internal.misc.VM.toThreadState(threadStatus);}}

通过源码我们可以看到Java中的线程存在6种状态,每种线程状态的含义如下

线程状态具体含义
NEW一个尚未启动的线程的状态。也称之为初始状态、开始状态。线程刚被创建,但是并未启动。还没调用start方法。MyThread t = new MyThread()只有线程象,没有线程特征。
RUNNABLE当我们调用线程对象的start方法,那么此时线程对象进入了RUNNABLE状态。那么此时才是真正的在JVM进程中创建了一个线程,线程一经启动并不是立即得到执行,线程的运行与否要听令与CPU的调度,那么我们把这个中间状态称之为可执行状态(RUNNABLE)也就是说它具备执行的资格,但是并没有真正的执行起来而是在等待CPU的度。
BLOCKED当一个线程试图获取一个对象锁,而该对象锁被其他的线程持有,则该线程进入Blocked状态;当该线程持有锁时,该线程将变成Runnable状态。
WAITING一个正在等待的线程的状态。也称之为等待状态。造成线程等待的原因有两种,分别是调用Object.wait()、join()方法。处于等待状态的线程,正在等待其他线程去执行一个特定的操作。例如:因为wait()而等待的线程正在等待另一个线程去调用notify()或notifyAll();一个因为join()而等待的线程正在等待另一个线程结束。
TIMED_WAITING一个在限定时间内等待的线程的状态。也称之为限时等待状态。造成线程限时等待状态的原因有三种,分别是:Thread.sleep(long),Object.wait(long)、join(long)。
TERMINATED一个完全运行完成的线程的状态。也称之为终止状态、结束状态

各个状态的转换,如下图所示:

二、线程池-ThreadPoolExecutor

参数 :

public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory,RejectedExecutionHandler handler)

corePoolSize:           核心线程的最大值,不能小于0
maximumPoolSize:  最大线程数,不能小于等于0,maximumPoolSize >= corePoolSize
keepAliveTime:        空闲线程最大存活时间,不能小于0
unit:                          时间单位
workQueue:             任务队列,不能为null
threadFactory:         创建线程工厂,不能为null      
handler:                   任务的拒绝策略,不能为null  

例:

public class MyThreadPoolDemo3 {public static void main(String[] args) {ThreadPoolExecutor pool = new ThreadPoolExecutor(2,5,2,TimeUnit.SECONDS,new ArrayBlockingQueue<>(10), Executors.defaultThreadFactory(),new ThreadPoolExecutor.AbortPolicy());pool.submit(new MyRunnable());pool.submit(new MyRunnable());pool.shutdown();}
}

线程池的任务调度总结:

  1. 如果当前工作线程数量小于核心线程数量,执行器总是优先创建一个任务线程,而不是从线程队列中获取一个空闲线程
  2. 如果线程池中总的任务数量大于核心线程池数量,新接收的任务将被加入阻塞队列中,一直到阻塞队列已满。
  3. 当完成一个任务的执行时,执行器总是优先从阻塞队列中获取下一个任务,并开始执行,一直到阻塞队列为空
  4. 在核心线程池数量已经用完、阻塞队列也已经满了的场景下,如果线程池接收到新的任务,将会为新任务创建一个线程,并且立即开始执行新任务
  5. 在核心线程都用完、阻塞队列已满的情况下,一直会创建新线程去执行新任务,直到池内的线程总数超出。如果线程池的线程总数超过,线程池就会拒绝接收任务,当新任务过来时,会为新任务执行拒绝策略

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

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

相关文章

计算机网络——应用层(2)FTP,DNS

一、FTP&#xff1a;文件传输协议 将文件传输到远程主机或从远程主机传输文件。C/S模式。server是远程主机。 1、控制连接与数据连接分开 客户端服务器通过端口21联系&#xff0c;使用TCP传输协议客户端通过控制连接获得身份确认客户端通过控制连接发送命令浏览远程目录收到…

ZL-099动物行为学视频分析系统

简单介绍&#xff1a; 动物行为学视频分析系统是一套通过视频摄像机和计算机&#xff0c;采用图像处理技术&#xff0c;自动跟踪和记录动物活动的通用型运动轨迹记录分析系统&#xff0c;可以应用在神经药理&#xff0c;学习记忆药理&#xff0c;药理和新药神经系统一般药理毒理…

STM32SPI通信外设并读写W25Q64

文章目录 前言介绍SPI外设SPI框图简化框图 时序主模式全双工连续传输非连续传输 软硬件波形对比硬件SPI读写W25Q64接线图代码规划代码实现 前言 本文介绍STM32中自带的SPI外设&#xff0c;在大容量产品和互联型产品上&#xff0c;SPI接口可以配置为支持SPI协议或者支持I2S音频…

前端实现自动获取农历日期:探索JavaScript的跨文化编程

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…

Verilog语法——按位取反“~“和位宽扩展的优先级

前言 先说结论&#xff0c;如下图所示&#xff0c;在Verilog中“~ ”按位取反的优先级是最高的&#xff0c;但是在等式计算时&#xff0c;有时候会遇到位宽扩展&#xff0c;此时需要注意的是位宽扩展的优先级高于“~”。 验证 仿真代码&#xff0c;下面代码验证的是“~”按位取…

【canvas】canvas基础使用(七):绘制图像

简言 学习canvas如何绘制图片或视频。 绘制图像 给定一个图像&#xff0c;一般使用drawImage()方法绘制。 drawImage 绘制图像 Canvas 2D API 中的 CanvasRenderingContext2D.drawImage() 方法提供了多种在画布&#xff08;Canvas&#xff09;上绘制图像的方式。 语法&…

python连接mysql步骤

要在 Python 中连接 MySQL 数据库&#xff0c;你需要遵循以下步骤&#xff1a; 步骤 1: 安装 MySQL Connector/Python 首先&#xff0c;确保你的系统中已安装了 MySQL Connector/Python&#xff0c;这是 MySQL 官方提供的用于在 Python 中连接 MySQL 的驱动程序。你可以通过 …

为什么内存要对齐

1.硬件要求&#xff1a; 许多处理器和硬件架构对于特定数据类型的访问要求内存地址是对齐的。例如&#xff0c;某些处理器可能要求访问4字节整数的地址必须是4的倍数&#xff0c;否则可能会导致性能下降甚至错误。因为可能会导致额外的处理器周期用于处理未对齐的访问&#xff…

Swift中的类

在Swift中&#xff0c;类是一种复合类型&#xff0c;用于创建具有属性和方法的对象。它是面向对象编程的基本构建块之一。 以下是一个简单的类的示例&#xff1a; class Person {var name: Stringvar age: Intinit(name: String, age: Int) {self.name nameself.age age}fu…

四川易点慧电子商务抖音小店安全:护航您的在线交易之旅

在数字化浪潮席卷全球的今天&#xff0c;电子商务已经成为人们日常生活的重要组成部分。四川易点慧电子商务抖音小店作为新兴的电商平台&#xff0c;以其便捷、高效的特点吸引了众多消费者的目光。然而&#xff0c;随着网络交易的日益频繁&#xff0c;安全问题也日益凸显。本文…

揭秘!这些部门对六西格玛技术情有独钟

当下&#xff0c;企业为了提升产品质量、降低成本、提高效率&#xff0c;纷纷寻求先进的管理方法和技术手段。其中&#xff0c;六西格玛技术因其卓越的绩效改善能力&#xff0c;受到了众多企业的青睐。那么&#xff0c;哪些部门对六西格玛技术情有独钟呢&#xff1f;天行健六西…

如何使用Docker部署WPS Office服务并实现无公网IP远程处理文档表格

文章目录 1. 拉取WPS Office镜像2. 运行WPS Office镜像容器3. 本地访问WPS Office4. 群晖安装Cpolar5. 配置WPS Office远程地址6. 远程访问WPS Office小结 7. 固定公网地址 wps-office是一个在Linux服务器上部署WPS Office的镜像。它基于WPS Office的Linux版本&#xff0c;通过…

每日一题(leetcode765):情侣牵手--并查集和哈希表

代码技巧&#xff0c;在读取列表时都除2&#xff0c;符合情理并且节省了空间。 class Solution { private:int get(vector<int>& f,int x){if(f[x]x){return x;}int newxget(f,f[x]);return newx;}void add(vector<int>& f,int a,int b){int zuaget(f,a);…

EPSON的RX8900CE适合用于安防摄像头产品

安防摄像头产品可以实现视频监控&#xff0c;运动检测&#xff0c;人脸识别等功能&#xff0c;并且可以支持远程访问&#xff0c;成了用户的“千里眼”。之前安防摄像头的价格比较高&#xff0c;一般比较重要的场合才会使用&#xff0c;目前随着安防摄像头价格逐渐降低&#xf…

MASA Framework系列-在电商领域的应用(7)

MASA Framework在电商领域的应用实例可以体现其强大的微服务架构和丰富的功能组件。以下是一个基于MASA Framework构建的电商实例的概述&#xff1a; 一、系统架构 该电商系统采用了MASA Framework的微服务架构&#xff0c;将各个功能模块拆分为独立的服务&#xff0c;如用户…

一进四出学生宿舍智能电表

一进四出学生宿舍电表功能特点** 一、多路电能计量** 该电表采用先进的电路设计&#xff0c;能够同时实现四路电能的独立计量。每路输出都可以单独控制和管理&#xff0c;方便对学生宿舍中各个用电设备的电能消耗进行精确统计。 二、实时电量显示** 电表配备有高清LED显示屏…

用四种方法实现轮播图

1、css3动画实现的轮播图 实现原理如下&#xff1a; 1、设置大的div a)设置绝对定位&#xff0c;定位位置&#xff1b; b)设置图片展示出来的高度和宽度&#xff08;height和width&#xff09;&#xff1b; c)设置overflow:hidden;设置超出部分隐藏&#xff1b;使得图片只能在…

[学习笔记] 网络安全 bp爆破

我们用的靶场是用的一个皮卡丘的漏洞练习平台的一个靶场首先要开启浏览器代理&#xff0c;然后开启在bp上开启就是拦截代理模块里面的拦截它有4个攻击模式&#xff0c;分别是&#xff1a; Sniper&#xff08;狙击手&#xff09;&#xff1a;这种攻击方式主要是将包内各个用$$符…

NL2SQL进阶系列(5):论文解读业界前沿方案(DIN-SQL、C3-SQL、DAIL-SQL)、新一代数据集BIRD-SQL解读

NL2SQL进阶系列(5):论文解读业界前沿方案(DIN-SQL、C3-SQL、DAIL-SQL)、新一代数据集BIRD-SQL解读 NL2SQL基础系列(1):业界顶尖排行榜、权威测评数据集及LLM大模型(Spider vs BIRD)全面对比优劣分析[Text2SQL、Text2DSL] NL2SQL基础系列(2):主流大模型与微调方法精选集…

代码对比同步辅助工具,提高开发效率

一开始只是开发抖音的程序&#xff0c;后面复制代码去改成快手、小红书、拼多多等平台的程序。 然后一有些修改调整&#xff0c;可能需要同步到其他平台的代码中&#xff1b; 每次需要打开一个或者多个开发工具IDE&#xff0c;每个IDE打开一个项目&#xff0c;再去对照路径翻…