Java线程6种生命周期及转换

多线程技术是我们后端工程师在面试的时候必问的一个知识点,今天就来盘点一下多线程的相关知识,

先来说下进程,线程及线程的生命周期:
进程:进程就是正在进行中的程序,是没有生命的实体,只有在运行时处理器才会赋予它生命,才能成为一个活动的实体,我们称之为“进程”。
每一个进程都有一个独一无二的编号,被成为进程编号,简称PID( Process identifier),PID是一串数字,取值为 1-32768。 每个进程有独立的地址空间和资源,相互之间不会直接影响。

线程:线程是进程中的执行运算的最小单位,是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,可以与同属同一个进程的其他线程共享进程所拥有的全部资源。虽然线程共享资源,但每个线程有自己的栈空间和程序计数器,独立运行,进程之间可以并发执行。

进程和线程的关系:一个进程可以包含多个线程,线程是进程的一部分。打个比方:把领导分配的一个开发任务比作一个进程,参与这个开发任务的开发人员就是线程,如果多个开发人员一起开发,就属于多个线程并发执行。如果只有一个开发人员开发,那就是单线程执行

下面详细说一下线程,因为面试的时候线程相关知识被问到的概率还是很大的。

1、线程生命周期的几种状态:
线程的生命周期指的是线程从创建到销毁的整过过程,通常情况下线程的生命周期有以下5种状态:

  • 初始状态
  • 可运行状态
  • 运行状态
  • 休眠状态
  • 终止状态

这5种状态转化图如下:
在这里插入图片描述

通用的状态有以上五中,但是看Thread.State 源码会发现, Java 线程的生命周期和上面说的生命周期是不同的,代码里有以下状态:
在这里插入图片描述
(1)NEW:初始化状态
(2)RUNNABLE:可运行状态(就绪状态)
(3)BLOCKED:阻塞状态
(4)WAITING:无限时等待状态
(5)TIMED_WAITING:有时限等待状态
(6)TERMINATED:终止状态

分别解释下这6中状态(不想看太多文字的可直接看最后的图片总结):

(1)New-初始化状态:表示线程被创建但是尚未启动的状态, new Thread() 新建一个线程,但是如果线程没有开始运行start()方法,所以也没有开始执行run()方法中的代码,那么它此时的状态就是初始化状态。

(2)Runable-可运行状态: Java 中的 Runable 状态对应操作系统线程状态中的两种状态,分别是 Running 和 Ready。到了这个状态下一步要么等着执行,要么直接执行。
也就是说,Java 中处于 Runnable 状态的线程有可能正在执行,也有可能没有正在执行,正在等待被分配 CPU 资源。
所以,如果一个正在运行的线程是 Runnable 状态,当它运行到任务的一半时,执行该线程的 CPU 被调度去做其他事情,导致该线程暂时不运行,它的状态依然不变,还是 Runnable,因为它有可能随时被调度回来继续执行任务。

(3)Blocked-阻塞状态:
阻塞状态包括三种状态,分别是 Blocked(被阻塞)、Waiting(等待)、Timed Waiting(计时等待)
处于运行中的线程,由于某种原因放弃对cpu的使用权,处于阻塞状态,直到其进入就绪状态,才有机会再次被cpu调用进入运行状态。一般进入Blocked状态 只有一种可能,就是进入 synchronized 保护的代码块或者方法时没有抢到monitor锁, 当处于 Blocked的线程抢到 monitor 锁,就会从 Blocked 状态回到Runnable 状态。

(4)Waiting-无限时等待:没有超时时间的等待,进入waiting状态一般有以下几种情况:

  • 没有设置 Timeout 参数的 Object.wait() 方法, 其他线程调用notify() 或 notifyAll()来唤醒。
  • 没有设置 Timeout 参数的 Thread.join() 方法,join的线程结束或者被中断,上一线程才会进入就绪状态。
  • LockSupport.park() 方法,通过 执行了 LockSupport.unpark()方法唤醒。

(5)Timed Waiting-有限时等待:有超时时间的等待, 如果超时时间到了且能直接获取到锁,直接恢复到 Runnable 状态;进入此状态一般有以下几种情况:

  • 设置了时间参数的 Thread.sleep(long millis) 方法;
  • 设置了时间参数的 Object.wait(long timeout) 方法;
  • 设置了时间参数的 Thread.join(long millis) 方法;
  • 设置了时间参数的 LockSupport.parkNanos(long nanos) 方法和 LockSupport.parkUntil(long deadline) 方法,执行LockSupport.unpark()方法可直接唤醒。

(6)Terminated-终止状态:线程执行结束的状态。

  • 正常结束,线程结束,也就是线程终止,
  • 出现一个没有捕获的异常,终止了 run() 方法,最终导致意外终止。
  • 调用stop(),会造成死锁,线程不安全,不建议使用

2、用一张图来说明各个状态之间的转化流程:
在这里插入图片描述

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

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

相关文章

美格智能5G车规级通信模组: 5G+C-V2X连接汽车通信未来十年

自2019年5G牌照发放开始,经过五年发展,我国5G在基础设施建设、用户规模、创新应用等方面均取得了显著成绩,5G网络建设也即将从基础的大范围覆盖向各产业融合的全场景应用转变。工业和信息化部数据显示,5G行业应用已融入76个国民经…

GooglePlay: 应用和游戏的内容分级

对于后台私信的开发者们,希望能够携带详细过审记录和拒审邮件一同发来,方便我们尽快解决问题 应用与游戏 为您的应用或游戏选择类别和标签选择要添加的标签选择类别并添加标签类别示例与应用、游戏以及两者中所投放广告的内容分级相关的要求应用如何获得内容分级内容分级的用…

人工智能学习--ANN模型、SVR模型

人工神经网络 (ANN) 概念 人工神经网络(ANN)是一种模拟人脑神经元连接结构的计算模型,通过多层神经元和加权连接来处理数据。典型的ANN由输入层、隐藏层和输出层组成。 工作原理 ANN通过传递输入数据至隐藏层神经元,将各层输出…

多线程--模拟实现定时器--Java

一、定时器的概念 定时器的本质就是一个闹钟,时间到了开始执行某些逻辑。Java标准库中的定时器是Timer。 我们查阅Java文档可以详细看到定时器的使用方法: Timer最核心的方法就是schedule方法。值得注意的是我们通常描述任务是使用Runnable来描述&…

FrankenPHP实践

目录 1. 说明 2. 程序修改 3. 性能测试 4. 配置 4.1 Docker化部署 4.2 泛域名和证书设置 4.3 相关命令 5. 要点: 6. 参考 1. 说明 Frankenphp是一个先进的,结合了高性能Caddy服务器的PHP环境框架,它允许用户只需要少量改动&#xff…

2024第三次随堂测验参考答案

7-1 求一组数组中的平均数 输入10个整数&#xff0c;输出这10个整数的的平均数&#xff0c;要求输出的平均数保留2位小数 输入样例&#xff1a; 1 2 3 4 5 6 7 8 9 10 输出样例&#xff1a; 5.50 参考答案&#xff1a; #include <stdio.h> int main(){int sum 0;…

Docker 镜像体积优化实践:从基础镜像重建到层压缩的全流程指南

​ 由于最近在发布的时候发现docker镜像体积变得越来越大&#xff0c;导致整个打包发布流程变得非常耗时了。所以又接到一个差事&#xff0c;优化最终镜像体积。顺便也记录一下docker镜像体积优化的一些步骤。 大概步骤可以分为以下几个步骤&#xff1a; 重做基础镜像&#x…

[linux 驱动]PWM子系统详解

目录 1 描述 2 结构体 2.1 pwm_chip 2.2 pwm_ops 2.3 pwm_device 2.4 pwm_class 3 相关函数 3.1 注册与注销 PWM 控制器 3.1.1 pwmchip_add 3.1.2 pwmchip_remove 3.2 申请与释放 PWM 设备 3.2.1 pwm_request 3.2.2 devm_pwm_get 3.2.3 pwm_free 3.3 控制 PWM …

Linux入门(2)

林纳斯托瓦兹 Linux之父 1. echo echo是向指定文件打印内容 ehco要打印的内容&#xff0c;不加任何操作就默认打印到显示器文件上。 知识点 在Linux下&#xff0c;一切皆文件。 打印到显示器&#xff0c;显示器也是文件。 2.重定向 >重定向操作&#xff0c;>指向的…

如何判断本地DNS是否污染

本地DNS污染是一种比较复杂且会对网络访问产生负面影响的现象。DNS即域名系统&#xff0c;它的主要功能是将便于人们记忆的域名转换为计算机能够理解的IP地址。本地DNS污染是指在本地网络环境中&#xff0c;DNS解析过程受到恶意干扰或错误配置的影响&#xff0c;使得域名被解析…

线程池使用实战

线程池使用实战 1. 线程池使用1.1 例子11.2 例子2 1. 线程池使用 // 使用 ThreadPoolExecutor 创建线程池private final ThreadPoolExecutor executorService new ThreadPoolExecutor(Runtime.getRuntime().availableProcessors(), // 核心线程数Runtime.ge…

asp.net网站项目如何设置定时器,定时获取数据

在 Global.asax.cs 文件中编写代码来初始化和启动定时器。Global.asax.cs 文件定义了应用程序全局事件&#xff0c;比如应用程序的启动和结束。在这里&#xff0c;我们将在应用程序启动时初始化和启动定时器。 using System; using System.Timers;public class Global : Syste…

【数据仓库】Hive 拉链表实践

背景 拉链表是一种数据模型&#xff0c;主要是针对数据仓库设计中表存储数据的方式而定义的&#xff1b;顾名思义&#xff0c;所谓拉链表&#xff0c;就是记录历史。记录一个事务从开始一直到当前状态的所有变化的信息。 拉链表可以避免按每一天存储所有记录造成的海量存储问题…

Mysql在oracle的安装与配置(怕忘)

1、获取iso 安装oracle:https://mirrors.tuna.tsinghua.edu.cn/openeuler/openEuler-24.03-LTS/ISO/x86_64/openEuler-24.03-LTS-x86_64-dvd.iso openEuler-22.03-LTS-x86_64-dvd.iso 2、安装os 手动设置固定IP,建议大家网卡vm net8 网关:x.x.x.2 DNS:114.114.114.11…

日常工作采坑,关于图片压缩哪些坑一次性踩完。

文章目录 0.前言1.代码实现2.压缩工具包的配置 0.前言 首先说明一下这个图片压缩为什么那么艰难&#xff0c;主要原因还是在于需求过于奇葩。比较奇葩的原因有如下几点&#xff1a;   1.图片是一个很大的文件&#xff0c;我长这么大还没见过这个大的文件。图下可以图片文件可…

语音识别ic赋能烤箱,离线对话操控,引领智能厨房新体验

一、智能烤箱产品的行业背景 随着科技的飞速发展&#xff0c;智能家居已经成为现代家庭的新宠。智能烤箱作为智能家居的重要组成部分&#xff0c;正逐渐从高端市场走向普通家庭。消费者对于烤箱的需求不再仅仅局限于基本的烘焙功能&#xff0c;而是更加注重其智能化、便捷化和…

LeetCode 每日一题 2024/10/28-2024/11/3

记录了初步解题思路 以及本地实现代码&#xff1b;并不一定为最优 也希望大家能一起探讨 一起进步 目录 10/28 685. 冗余连接 II10/29 3211. 生成不含相邻零的二进制字符串10/30 3216. 交换后字典序最小的字符串10/31 3165. 不包含相邻元素的子序列的最大和11/1 3259. 超级饮料…

faiss用于大数据量的向量检索

背景:10亿(Billion级别)的数据应该是一个很大的数据了,尤其是维度在768+级别(还有1024,1536等),这个数据量我做了一个实验,shape为(1kw,768)的array(numpy)占内存为30G(float32格式),如果能降低为float16更好不过,但似乎faiss没有这种方法或者精度有所损失。 …

一文详解开源ETL工具Kettle!

一、Kettle 是什么 Kettle 是一款开源的 ETL&#xff08;Extract - Transform - Load&#xff09;工具&#xff0c;用于数据抽取、转换和加载。它提供了一个可视化的设计环境&#xff0c;允许用户通过简单的拖拽和配置操作来构建复杂的数据处理工作流&#xff0c;能够处理各种数…

D59【python 接口自动化学习】- python基础之异常

day59 捕获异常常见问题 学习日期&#xff1a;20241105 学习目标&#xff1a;异常 -- 75 避坑指南&#xff1a;编写捕获异常程序时经常出现的问题 学习笔记&#xff1a; 捕获位置设置不当 设置范围不当 捕获处理设置不当 嵌套try-except语法错误 总结 位置&#xff0c;范围…