JavaEE之多线程编程:3. 线程的状态(易懂!)

文章目录

    • 一、关于线程的状态
    • 二、观察线程的所有状态
      • 1. NEW状态
      • 2. TERMINATED状态
      • 3. RUNNABLE状态
      • 4. TIMED_WAITING

一、关于线程的状态

进程最核心的状态,一个是就绪状态,一个是阻塞状态(对于线程同样使用)。
以线程为单位进行调度的。
在Java中,又给线程赋予了一些其他的状态。

线程的状态是一个枚举类型 Thread.State

public class ThreadState {public static void main(String[] args) {for (Thread.State state : Thread.State.values()) { //遍历枚举中的每个元素System.out.println(state);}}
}

二、观察线程的所有状态

线程的状态一共有6个:

  • NEW:安排了工作, 还未开始行动。(Thread对象已经有了,.start()方法还没调用)
  • TERMINATED:工作完成了。(Thread对象还在,内核中的线程已经没了)
  • RUNNABLE:可工作的,又可以分成正在工作中和即将开始工作。(就绪状态 线程已经在cpu上执行了/线程正在排队等待上cpu执行)
  • TIMED_WAITING:表示排队等待其他事情(阻塞,由于sleep这种固定的方式产生的阻塞)
  • WAITING:表示排队等待其他事情(阻塞,由于wait这种不固定时间的方式产生的阻塞)
  • BLOCKED:表示排队等待其他事情(阻塞,由于锁竞争导致的阻塞)

后三个都是阻塞状态,是把三种不同的阻塞状态的原因给拎出来了。这样后续定位“线程卡死”问题的时候,就很容易通过状态来初步确定卡死的原因是什么了。

1. NEW状态

并没有调用start() 也并没有调用线程,此时它对象里面的状态就是new状态(开始状态)。

 public static void main(String[] args) {Thread t = new Thread(() -> {while (true) {}});//在调用 start 之前获取状态,此时就是NEW状态System.out.println(t.getState()); //并没有调用start() 也并没有调用线程,此时它对象里面的状态就是new状态//运行结果:NEW 

2. TERMINATED状态

在线程执行结束之后,获取线程状态,此时是TERMINARED状态(结束状态)。

  public static void main(String[] args) throws InterruptedException {Thread t = new Thread(() -> {});t.start();t.join(); //通过join方法进行等待//在线程执行结束之后,获取线程的状态,此时是TERMINARED状态System.out.println(t.getState());//执行结果:TERMINARED       

3. RUNNABLE状态

表示此线程正在运行当中,或者它随时准备去运行,此时它就是就绪状态。

public static void main(String[] args) throws InterruptedException {Thread t = new Thread(() -> {while (true) { //此线程全速运行}});t.start();for (int i = 0; i < 5; i++) {System.out.println(t.getState());Thread.sleep(1000); //主线程中,每隔1秒钟打印一次}}//运行结果:
RUNNABLE
RUNNABLE
RUNNABLE
RUNNABLE
RUNNABLE//且RUNNABLE每1s中运行一次

4. TIMED_WAITING

表示指定一定时间来进行等待。

 public static void main(String[] args) throws InterruptedException {Thread t = new Thread(() -> {while (true) {try {Thread.sleep(1000); //等待1s} catch (InterruptedException e) {e.printStackTrace();}}});t.start();for (int i = 0; i < 5; i++) {System.out.println(t.getState());Thread.sleep(1000);}}
}//输出结果:
RUNNABLE
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING//设置了等待1s再执行,所以第1s没有执行到,打印主线程的代码

上述内容,是多进程中的四种状态。

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

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

相关文章

React入门 - 10(说一说关于 React 的一些理论 )

本章内容 目录 1、React 是一种 ”声明式“开发2、React 可与其他框架并存3、React 的”组件式“开发4、React 遵循”单向数据流“5、React 是一个用于构建”视图层“的框架6、React 采用”函数式编程“ 截止到上一节内容&#xff0c;我们就使用 React实现 TodoList的功能已经…

AOI与AVI:在视觉检测中的不同点和相似点

AOI&#xff08;关注区域&#xff09;和AVI&#xff08;视觉感兴趣区域&#xff09;是视觉检测中常用的两个概念&#xff0c;主要用于识别和分析图像或视频中的特定区域。虽然这两个概念都涉及到注视行为和注意力分配&#xff0c;但它们在定义和实际应用等方面有一些差异。 AOI…

基于SpringBoot的社区帮扶对象管理系统

文章目录 项目介绍主要功能截图&#xff1a;部分代码展示设计总结项目获取方式 &#x1f345; 作者主页&#xff1a;超级无敌暴龙战士塔塔开 &#x1f345; 简介&#xff1a;Java领域优质创作者&#x1f3c6;、 简历模板、学习资料、面试题库【关注我&#xff0c;都给你】 &…

视频生成的路线之争:基于LLMs 和 基于SD 的技术路线孰优孰劣?

Diffusion Models视频生成-博客汇总 前言:在 AI 领域,近年来各个子领域都逐渐向 transformer 架构靠拢,只有视觉生成领域一直以 diffusion 结构作为主流方向,但是近年来谷歌、Meta、华为等大厂都在尝试使用基于LLMs的结构完成视觉生成任务。相比于趋于成熟的图像生成任务,…

win10 使用wezterm替代tmux

在windows系统下&#xff0c;没有直接的tmux替代品。wezterm作为一个可高度自定义配置的终端&#xff0c;可以一定程度替代tmux&#xff0c;满足我在windows系统下替换tmux的需求。 配置wezterm&#xff0c;使其快捷键风格接近tmux。快捷键配置如下。基于该配置wezterm.lua&am…

常见的 Linux 发行版和相应的服务管理命令

一、在 Linux 系统中&#xff0c;你可以使用不同的命令来停止服务&#xff0c;具体取决于你的系统和使用的初始化系统&#xff08;init 系统&#xff09;或服务管理工具。以下是一些常见的 Linux 发行版和相应的服务管理命令&#xff1a; 1. 使用 Systemd&#xff08;大多数现…

Git教程学习:03 记录每次更新到仓库

文章目录 1 检查当前文件状态2 跟踪新文件3 暂存已修改的文件4 状态简览5 忽略文件6 查看已暂存和未暂存的修改7 提交更新8 跳过使用暂存区域9 移除文件10 移动文件 现在我们的机器上有了一个 真实项目 的 Git 仓库&#xff0c;并从这个仓库中检出了所有文件的 工作副本。 通常…

windows和linux实时监控文本内容的命令

很多时候我们需要实时查看日志的内容 WIndows Get-Content someFile.txt -WaitLInux tail -f /var/log/apache2/access.logtail命令使用 tail命令是一个用于在Linux和Unix系统中查看文件末尾内容的命令。它通常用于实时监控日志文件的更新&#xff0c;以及查看文件的最新内…

前端和后端之间的CORS 跨域和解决办法

什么是CORS&#xff08;Cross-Origin Resource Sharing&#xff0c;跨源资源共享&#xff09; 跨源资源共享&#xff08;CORS&#xff0c;或通俗地译为跨域资源共享&#xff09;是一种基于 HTTP 头的机制&#xff0c;该机制通过允许服务器标示除了它自己以外的其他源&#xff0…

Docker之安装Nginx

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是君易--鑨&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的博客专栏《Docker之Dockerfile构建镜像》。&#x1f3af;&…

为什么 macOS 比 Windows 稳定?

在计算机操作系统领域&#xff0c;macOS 和 Windows 分别是苹果公司和微软公司的主打产品。尽管两者都拥有大量的用户群体&#xff0c;但在稳定性和用户体验方面&#xff0c;macOS 常常被认为优于 Windows。那么&#xff0c;为什么 macOS 比 Windows 更稳定呢&#xff1f; 我们…

【Python 千题 —— 基础篇】元组的合并

题目描述 题目描述 现在有一个元组 (1, 2, 3, 4),用其它不破坏元组不可破坏性的基础方法上,向元组中添加 6,7,8 这几个数字。 输入描述 无 输出描述 输出“修改”后的元组。 示例 示例 ① 输出: (1, 2, 3, 4, 6, 7, 8)

算法题-爬楼梯-不同思路解法

主要记录个人思考过程&#xff0c;不同方案实现思路的演变 题目 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 示例 1&#xff1a; 输入&#xff1a;n 2 输出&#xff1a;2 解释&#xff1a;…

你真的知道如何查看 Elasticsearch 的 Debug 日志吗?!

当我们遇到问题或者需要深入了解 Elasticsearch 的运行机制时&#xff0c;调整日志等级&#xff08; logging level &#xff09;到更详细的级别&#xff0c;比如 DEBUG、TRACE &#xff0c;会是一个有效且必须要掌握的方法。 Elasticsearch 提供了如下的接口来支持动态变更 l…

Java中的线程池技术进阶

Java中的线程池技术是用于管理和复用线程的一种技术&#xff0c;它可以有效地提高应用程序的性能和响应速度。在Java中&#xff0c;线程池可以通过java.util.concurrent包中的ExecutorService接口和相关实现类来创建和使用。 以下是一些关于Java线程池技术的进阶知识&#xff…

KY73 合唱队形

动态规划&#xff0c;最长LIS模板&#xff0c;正反各用一次 ti #include<bits/stdc.h>using namespace std;int n; int a[105], dp1[105], dp2[105];int main() {while(cin>>n){memset(a, 0, sizeof(0));memset(dp1, 0, sizeof(dp1));memset(dp2, 0, sizeof(dp2))…

C++系列-第1章顺序结构-9-字符类型char

在线练习&#xff1a; http://noi.openjudge.cn/ https://www.luogu.com.cn/ 总结 本文是C系列博客&#xff0c;主要讲述字符类型char 字符类型char 在C编程语言中&#xff0c;char是一种基本的数据类型&#xff0c;它用于存储单个字符。字符可以是字母、数字、标点符号或者…

简单的推箱子游戏实战

目录 项目分析 地图初始化 背景图片 游戏场景图片: 热键控制 按键设置 确定人物位置 实现人物移动(非箱子,目的地) 推箱子控制 游戏结束 最终代码 合法性判断: 项目分析 墙:0,地板:1,箱子目的地:2,小人:3,箱子:4,箱子命中目标:5 地图初始化 背景图片 #include <…

基于SkyEye仿真飞腾处理器:运行U-Boot并加载Phytium-FreeRTOS

仿真平台在帮助提升研发效率、加快产品面市时间上的作用已得到诸多验证&#xff0c;通过对处理器进行仿真来支持嵌入式系统及软件的虚拟化开发、测试和验证成为目前应用较为广泛的方法。天目全数字实时仿真软件SkyEye是一款基于可视化建模的硬件行为级仿真平台&#xff0c;在众…