一文搞懂线程的生命周期以及状态

news2024/9/20 4:05:58
一. Java 线程生命周期概述

Java 中的线程生命周期主要分为以下五个状态:

  • 新建状态(NEW):线程被创建但尚未启动。
  • 可运行状态(RUNNABLE):线程可以被操作系统调度执行。
  • 阻塞状态(BLOCKED):线程正在等待获取锁,无法继续执行。
  • 等待状态(WAITING):线程等待另一个线程显式地唤醒它。
  • 超时状态(TIMED_WAITING):线程在等待指定时间后可以继续执行。
  • 终止状态(TERMINATED):线程已经执行完毕或因异常终止。
二. 线程生命周期图示

这里借用一下二哥的图片

在上图中,我们可以清晰地看到 Java 线程生命周期中各个状态及它们之间的转换关系。

三. 各个状态的详细解释
1. 新建状态(NEW)

当线程对象被创建时,线程处于新建状态。这时,线程尚未开始执行。可以通过调用 new Thread()new Thread(Runnable target) 来创建新线程。此时,线程还没有开始运行,需要调用 start() 方法才能进入下一阶段。

2. 可运行状态(RUNNABLE)

线程调用了 start() 方法后,进入可运行状态。在该状态下,线程可能正在运行,也可能在等待操作系统的调度。Java 中的 RUNNABLE 包括了操作系统中的就绪(Ready)和运行(Running)状态。线程在这个状态下能够获得 CPU 时间片并执行任务。

3. 阻塞状态(BLOCKED)

当一个线程试图获取一个已经被其他线程占用的锁时,它会进入阻塞状态。在这种情况下,线程无法继续执行,直到锁被释放。

阻塞状态会严重影响多线程程序的性能,因此合理的锁管理对于并发编程至关重要。

4. 等待状态(WAITING)

线程调用 Object.wait()Thread.join() 方法时,进入等待状态。此时,线程等待其他线程通过 notify()notifyAll() 方法显式唤醒它。

WAITING 状态下,线程不消耗 CPU 时间片,但仍然被认为是活动线程。

5. 超时等待状态(TIMED_WAITING)

线程可以在调用带有超时参数的方法时进入超时等待状态,比如 Thread.sleep()Object.wait(long timeout)。在这种状态下,线程会等待指定时间,然后自动唤醒。

线程在超时等待状态结束后,会重新进入可运行状态。

6. 终止状态(TERMINATED)

当线程的 run() 方法执行完成或遇到异常而退出时,线程进入终止状态。此时,线程生命周期结束,无法再次启动。

在终止状态下,线程的所有资源都会被回收,无法再次进入其他状态。

四. 状态转换的关键方法

Java 中,线程状态的转换由一系列方法控制。以下是一些常用方法及其对应的状态转换:

  • start():从 新建状态 进入 可运行状态
  • wait():从 可运行状态 进入 等待状态
  • sleep():从 可运行状态 进入 超时等待状态
  • join():从 可运行状态 进入 等待状态,直到指定线程执行完成。
  • notify() / notifyAll():从 等待状态 返回 可运行状态
  • 线程执行完毕异常退出:从 可运行状态 进入 终止状态
五. 线程生命周期中的常见问题
  • 线程阻塞问题:在阻塞状态下,线程长时间无法获得锁,会导致性能下降,甚至死锁。使用 ReentrantLock 等更灵活的锁机制可以避免这种问题。

  • 线程资源消耗:线程在超时等待或等待状态下虽然不占用 CPU,但仍然消耗系统资源,频繁创建和销毁线程会增加系统开销。可以通过线程池(如 ExecutorService)来管理线程的创建和回收。

  • 线程同步问题:线程之间共享数据时需要同步操作,以避免竞争条件。可以使用 synchronized 关键字、Lock 接口或其他同步机制。

六. 总结

Java 线程的生命周期由多个状态组成,线程可以在这些状态之间进行转换。理解线程的生命周期不仅有助于编写高效的并发程序,还能有效防止死锁、线程阻塞等常见问题。另外java的线程状态和操作系统的线程状态有些许不同,大家可以结合记忆防止混淆。

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

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

相关文章

如何投放Spotify广告:费用与关键考量

Spotify在2008年上市时,市场上已经充斥着各种竞争对手的音乐服务。这款音乐流媒体应用不仅打破了预期,还在180个市场上吸引了超过602百万用户,其中包括2.36亿订阅用户。现如今,它是全球最受欢迎的音频流媒体订阅服务。 Spotify广…

MySQL分组查询(DQL)

先看一下我的表内容和数据,再做接下来的例子和讲解1.分组函数的基本用法 select 字段列表 from 表名 [WHERE 条件] group by 分组字段名 [HAVING 分组后的过滤条件] 2.先声明where和having的区别 1.执行时机不同:where是分组之前进行过滤,…

❤Node08-Express-jwt身份认证

❤Node08-Express-jwt身份认证 1、token基本概念​ Session认证的局限性​ Session 认证机制需要配合Cookie才能实现。由于 Cookie 默认不支持跨域访问,所以,当涉及到前端跨域请求后端接口的时候,需要做很多额外的配置,才能实现…

特征值特征向量

正交矩阵 施密特正交化,本质上是正交​编辑投影定理的应用

再次进阶 舞台王者 第八季完美童模全球赛荣耀大使【李暖希】赛场秀场超燃合集!

7月20-23日,2024第八季完美童模全球总决赛在青岛圆满落幕。在盛大的颁奖典礼上,一位才能出众的少女——李暖希,迎来了她舞台生涯的璀璨时刻。 荣耀大使——李暖希,以璀璨童星之姿,优雅地踏上完美童模盛宴的绚丽舞台&am…

Python爱心射线(完整代码)

目录 系列目录 写在前面​ 完整代码 下载代码 代码分析 写在后面 系列目录 序号直达链接表白系列1Python制作一个无法拒绝的表白界面2Python满屏飘字表白代码3

【工资计算 / 2】

题目 枚举 #include <bits/stdc.h> using namespace std; int T; int a[] {0,1500,4500,9000,35000,55000,80000,1000000}; int b[] {0,3,10,20,25,30,35,45}; int check(int x) {if(x < 3500) return x;x - 3500;int tax 0;for(int i 1; i < 8; i){if(x >…

【Spring Boot 整合 MyBatis 详细教程】

文章目录 Spring Boot 整合 MyBatis 详细教程简介环境准备项目搭建项目结构配置项目1. pom.xml 配置2. 数据源和 MyBatis 配置3. 启动类配置4. Mapper 接口和 XML 映射文件 测试总结 Spring Boot 整合 MyBatis 详细教程 简介 Spring Boot 与 MyBatis 的整合可以让你轻松地构建…

Unity射击游戏开发教程:(35)轰炸敌人

现在敌人和飞机已经慢慢地越来越有各自地地行为了,在本文中,我们将介绍如何创建一个具有以下行为的敌人: 飞机会来回弹跳。飞机将有 4 架无人机轰炸机围绕飞机旋转。无人机轰炸机会偶尔投下沿着屏幕传播的炸弹。如果炸弹击中玩家或在随机时间后就会爆炸。如果炸弹没有击中玩…

机器学习--逻辑回归

逻辑回归 前情提要&#xff1a;线性回归 关于分类 C l a s s i f i c a t i o n Classification Classification 在逻辑回归中&#xff0c;我们只讨论 y ∈ { 0 , 1 } y\in\{0, 1\} y∈{0,1} 的情况。其中 1 1 1 表示 p o s i t i v e c l a s s positive \; class posit…

无人机培训机构组装调试技术详解

一、基础知识学习 在进入无人机组装调试领域之前&#xff0c;扎实的基础知识是不可或缺的。学员需掌握以下内容&#xff1a; 1. 无人机基本原理&#xff1a;了解无人机的飞行原理&#xff0c;包括升力、推力、重力和阻力等基本物理概念&#xff0c;以及无人机的飞行控制系统&…

CSP-J 初中的数学知识要学完, CSP-S 肯定是要需高中的知识

学信奥赛好处很多&#xff0c;进则科技特长&#xff0c;退则数理化强。

【97】shell实现精确延时

#!/bin/bash#使用date精确延时的函数&#xff0c;参数是毫秒 function precise_sleep_ms() {local duration_ms$1# 将毫秒转换为秒local duration_sec$(echo "scale9; $duration_ms / 1000" | bc)duration_sec$(printf "%.3f" "$duration_sec")#…

JDBC API详解二

PreparedStatement 作用&#xff1a; 预编译SQL的执行&#xff0c;&#xff0c;预防SQL注入问题 SQL注入 通过操作输入来修改预先定义好的SQL语句&#xff0c;用以达到执行代码对服务器进行攻击的方法&#xff1b; SQL注入延时 需求&#xff0c;完成用户登录 select * fr…

04 奇偶分家

题目&#xff1a; 代码&#xff1a; #include<iostream> using namespace std; #include<stdlib.h> #include<stdio.h>int main() {int N;cin>>N;int jicount0,oucount0;for(int i0;i<N;i){int temp;cin>>temp;if(temp%20){oucount;}else if…

【python基础】简要wxPython

文章目录 wxPython程序主事件循环通俗解释在窗口中添加控件 wxPython程序 import wxapp wx.App() frm wx.Frame(None, title第一个wxPython程序, size(400, 300), pos(100, 100)) frm.Show() app.MainLoop()app.MainLoop() 让应用程序进入主事件循环中。事件循环是一种事件或…

计网简简单单复习一下

文章目录 基础体系结构(分层模型)为什么要分层?OSI 七层模型?每一层的作用?TCP/IP 四层模型是什么?每一层的作用是什么?五层体系结构以及对应的协议每一层常见协议有哪些?从输入 URL 到页面展示到底发生了什么?URI和URL的区别;forward和redirect的区别DNS作用是什么?D…

Find My外卖箱|苹果Find My技术与外卖箱结合,智能防丢,全球定位

外卖箱是外卖送餐时使用的具有保温广告功能的箱包&#xff0c;一般具有轻便易携&#xff0c;保温性好&#xff0c;耐用&#xff0c;安全&#xff0c;易固定在外送电动车上等特点。随着生活水平的提高和餐饮行业的飞跃&#xff0c;外卖作为餐饮行业一个新的利润增长点&#xff0…

论文翻译:ICLR-2024 PROVING TEST SET CONTAMINATION IN BLACK BOX LANGUAGE MODELS

PROVING TEST SET CONTAMINATION IN BLACK BOX LANGUAGE MODELS https://openreview.net/forum?idKS8mIvetg2 验证测试集污染在黑盒语言模型中 文章目录 验证测试集污染在黑盒语言模型中摘要1 引言 摘要 大型语言模型是在大量互联网数据上训练的&#xff0c;这引发了人们的…

湖南岳阳农商行高管更迭背后:不良率居高,盈利压力不减

撰稿|芋圆 来源|贝多财经 2024年8月末&#xff0c;湖南岳阳农商行发布了2024年半年报&#xff0c;报告显示截至2024年6月末&#xff0c;湖南岳阳农商行资产规模累计231亿元&#xff0c;较2023年末增长1.34%&#xff1b;营业收入3.1亿元&#xff0c;同比增幅6.54%&#xff1b;…