【Java】线程的状态

在这里插入图片描述
在之前的文章中,已经介绍了关于线程的基础知识。

我的主页: 🍆🍆🍆爱吃南瓜的北瓜

文章目录

  • ✍绪论
  • 🍐1.NEW
  • 🍐2.TERMINATED
  • 🍐3.RUNNABLE
  • --------------------
  • 🍐4.WAITING
  • 🍐5.TIMED_WAITING
  • 🍐6.BLOCKED

✍绪论

线程主要包括如下六种状态

在这里插入图片描述

在任意一个时间点,一个线程只能有且只有其中的一种状态,这6种状态分别如下:

  • NEW: 安排了⼯作, 还未开始⾏动

创建后尚未启动的线程处于这种状态

  • RUNNABLE: 可⼯作的. ⼜可以分成正在⼯作中和即将开始⼯作.

调用start()方法,RUNNABLE包括了操作系统线程状态中的Running和Ready,也就是处于此状态的线程有可能正在执行,也有可能正在等待着CPU为它分配执行时间(该线程已经获取了除CPU资源外的其他资源,等待获取CPU 资源后才会真正处于运行状态)。

  • BLOCKED: 这⼏个都表⽰排队等着其他事情

线程被阻塞了,“阻塞状态”与“等待状态”的区别是:“阻塞状态”在等待着获取到一个排他锁,这个事件将在另外一个线程获得锁的时候可能发生,比如synchronized之外;而“等待状态”则是在获得锁之后,主动释放锁,进入等待一段时间,或者等待唤醒动作的发生。

  • WAITING: 这⼏个都表⽰排队等着其他事情

处于这种状态的线程不会被分配CPU执行时间,它们要等待被其他线程显式地唤醒。以下方法会让线程陷入无限期的等待状态:

  • TIMED_WAITING: 这⼏个都表⽰排队等着其他事情

处于这种状态的线程也不会被分配CPU执行时间,不过无须等待被其他线程显式地唤醒,在一定时间之后它们会由系统自动唤醒。以下方法会让线程进入限期等待状态:

  • TERMINATED: ⼯作完成了.

已终止线程的线程状态,线程已经结束执行。

🍐1.NEW

创建了线程t 但是还未start,获取线程状态
就是NEW

  public static void main(String[] args) {Thread t = new Thread(()->{System.out.println("hello ");});System.out.println(t.getState());t.start();}

在这里插入图片描述

🍐2.TERMINATED

表示线程已经终止了
内核中线程已经销毁了

 public static void main(String[] args) throws InterruptedException {Thread t = new Thread(()->{System.out.println("hello ");});System.out.println(t.getState());t.start();t.join();//加入join()是为了确保t执行完毕,获取t的状态System.out.println(t.getState());}

在这里插入图片描述

🍐3.RUNNABLE

就绪状态
有两种可能

  1. 这个线程正在CPU上执行
  2. 这个线程虽然不在CPU上执行,但是随时可以调度到CPU上执行。

这两种情况,没必要分清楚到底是那种情况。

--------------------

WAITING,TIMED_WAITING,BLOCKED
这三种都是阻塞
不过产生阻塞的原因不同

🍐4.WAITING

死等进入阻塞

🍐5.TIMED_WAITING

带有超时时间的阻塞

public static void main(String[] args) throws InterruptedException {Thread thread = new Thread(()->{while (true){System.out.println("hello thread");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}});thread.start();thread.join();//thread.join(60000);}

在这里插入图片描述

🍐6.BLOCKED

带有锁竞争的阻塞

  public static void main(String[] args) {Object locker = new Object();Thread t1 = new Thread(()->{synchronized (locker){System.out.println("t1线程开始");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}System.out.println("t1线程结束");}});Thread t2 = new Thread(()->{synchronized (locker){System.out.println("t2线程开始");System.out.println("t2线程结束");}});t1.start();t2.start();}

使⽤ jconsole 可以看到 t1 的状态是 TIMED_WAITING , t2 的状态是 BLOCKED

修改代码,将t1中的sleep换成wait

 public static void main(String[] args) {Object locker = new Object();Thread t1 = new Thread(()->{synchronized (locker){System.out.println("t1线程开始");try {locker.wait();} catch (InterruptedException e) {throw new RuntimeException(e);}System.out.println("t1线程结束");}});Thread t2 = new Thread(()->{synchronized (locker){System.out.println("t2线程开始");System.out.println("t2线程结束");}});t1.start();t2.start();}

使⽤ jconsole 可以看到 t1 的状态是 WAITING

结论

  • BLOCKED 表⽰等待获取锁, WAITING 和 TIMED_WAITING 表⽰等待其他线程发来通知.
  • TIMED_WAITING 线程在等待唤醒,但设置了时限; WAITING 线程在⽆限等待唤醒

以上就是本文所有内容,如果对你有帮助的话,点赞收藏支持一下吧!💞💞💞

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

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

相关文章

harmonyOS的客户端存贮

什么是客户端存贮 在harmonyOS中,客户端存贮是指将数据存贮在本地设备以供应用程序使用; 注: 和feaureAblity搭配使用,content上下文的获取依赖该API如下: // 引入: import featureAbility from ohos.ability.featureAbility;// 使用: let content featureAbility.getConten…

28.ReentrantLock-多条件变量

synchronized中也有条件变量,当条件不满足时进入WaitSet等待。 ReentrantLock的条件变量比Synchronized强大之处在于它支持多个条件变量。 await和signal方法 多条件变量的使用流程 1.await需要获得锁。 2.await执行后会释放锁,进入ConditionObject…

算法基础--递推

😀前言 递推算法在计算机科学中扮演着重要的角色。通过递推,我们可以根据已知的初始条件,通过一定的规则推导出后续的结果,从而解决各种实际问题。本文将介绍递推算法的基础知识,并通过一些入门例题来帮助读者更好地理…

[Flutter]页面跳转和传值

一、页面跳转 1.基本页面跳转 Navigator 介绍 在 Flutter 中,Navigator 是一个管理应用视图(页面)的组件,它使用栈(Stack)的方式来控制页面的切换。每当你跳转到一个新页面时,Navigator 会将…

os模块篇(十一)

文章目录 os.chdir(path)os.chmod(path, mode, *, dir_fdNone, follow_symlinksTrue)os.chown(path, uid, gid, *, dir_fdNone, follow_symlinksTrue)os.getcwd()os.getcwdb()os.lchflags(path, flags)os.lchmod(path, mode)os.lchown(path, uid, gid) os.chdir(path) os.chdi…

CSS3 实现文本与图片横向无限滚动动画

文章目录 1. 实现效果2.html结构3. css代码 1. 实现效果 gif录屏比较卡&#xff0c;实际很湿滑&#xff0c;因为是css动画实现的 2.html结构 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"…

Java中的装饰器模式

在Java中&#xff0c;装饰器模式允许我们动态地给对象添加新的行为或责任&#xff0c;而无需修改原有类。以下是一个简单的装饰器模式示例&#xff0c;我们将模拟一个咖啡销售系统&#xff0c;其中基础饮料类&#xff08;Component&#xff09;是Coffee&#xff0c;装饰器类&am…

VC++、GCC、CLANG,INT128有符号整数编译器关键字

注意INT128为目标平台扩展关键字&#xff0c;不属于C/C语言本身支持特性&#xff0c;每个C/C编译器平台支持上都略有不同&#xff0c;甚至不支持。 可以详细参考本人此篇文章&#xff1a; GUN C/C (GCC/CLANG) 对于 __int128_t &#xff08;128位有符号大整数的扩展支持平台限…

vue快速入门(三)差值表达式

注释很详细&#xff0c;直接上代码 上一篇 新增内容 插值表达式基本用法插值表达式常用公式 源码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-wid…

M91HV-EX防爆布控球

防爆EX说明 产品介绍 布控球是专为户外无线网络及无供电环境而又需要现场录像取证和远程实时视频监控而打造的一款便携式的智能装备。布控球采用稳定的Linux嵌入式操作系统&#xff0c;运用先进的AI算法技术、5G无线通信技术、AGPS辅助定位技术及H.265视频压缩技术&#xff1b;…

语言模型进化史(上)

由于篇幅原因&#xff0c;本文分为上下两篇&#xff0c;上篇主要讲解语言模型从朴素语言模型到基于神经网络的语言模型&#xff0c;下篇主要讲解现代大语言模型以及基于指令微调的LLM。文章来源是&#xff1a;https://www.numind.ai/blog/what-are-large-language-models 一、语…

【Linux】进程控制详解

目录 前言 进程创建 认识fork 写时拷贝 再谈fork 进程终止 进程退出码 用代码来终止进程 常见的进程终止的方式 exit _exit 进程等待 进程等待的必要性 进程等待的方式 wait waitpid 详解status参数 详解option参数 前言 本文适合有一点基础的人看的&#…

5.3.2 实验2:配置交换机端口安全

1、实验目的 通过本实验可以掌握&#xff1a; 交换机管理地址配置及接口配置。查看交换机的MAC地址表。配置静态端口安全、动态端口安全和粘滞端口安全的方法。 2、实验拓扑 配置交换机端口安全的实验拓扑如图所示。 配置交换机端口安全的实验拓扑 3、实验步骤 &#xff…

Excel中文显示问号

直接上操作步骤&#xff1a; 1&#xff09;打开Excel -> 文件 -> 选项 -> 语言 2&#xff09;Office 显示语言&#xff0c;“中文(简体)”设置为首选。 3&#xff09;Office创作语言和校对&#xff0c;“中文(简体)”设置为首选。 网上用记事本转换的方法&#xff0c;…

【c++】STl-list使用list模拟实现

主页&#xff1a;醋溜马桶圈-CSDN博客 专栏&#xff1a;c_醋溜马桶圈的博客-CSDN博客 gitee&#xff1a;mnxcc (mnxcc) - Gitee.com 目录 1. list的介绍及使用 1.1 list的介绍 1.2 list的使用 1.2.1 list的构造 1.2.2 list iterator的使用 1.2.3 list capacity 1.2.4 …

点大商城V2版 2.5.7全开源版 全插件+百度+支付宝+QQ+头条+小程序端+uniapp开源端

点大商城V2是一款采用全新界面设计支持多端覆盖的小程序应用&#xff0c;支持H5、微信公众号、微信小程序、头条小程序、支付宝小程序、百度小程序&#xff0c;本程序是点大商城V2独立版&#xff0c;包含全部插件&#xff0c;代码全开源&#xff0c;并且有VUE全端代码。分销&am…

【Java基础】Java基础知识整合

文章目录 1. 转义字符2. 变量2.1 字符串与整型相加2.2 byte和short的区别2.3 float和double的区别2.4 char类型2.5 boolean类型2.6 自动类型转换及运算2.7 强制类型转换2.8 String的转换2.9 除法运算2.10 取模规则 3. 自增4. 逻辑运算符5. 赋值运算 6. 三元运算符&#xff1a;7…

babyAGI(7)-babyCoder源码阅读3(任务执行相关agent)

1. 任务分配agent 该agent会根据&#xff0c;objective和task的内容自动分配要执行的agent code_writer_agent 编写新代码或增加新功能使用该agentcode_reactor_agent 任务涉及到修改或优化执行该agentcommand_executor_agent 任务涉及到文件操作执行该agent 整个任务分配的…

前端的拖拽序列(drag)

html和css代码如下 <style>.item {width: 200px;height: 50px;background: rgb(15, 226, 219);margin: 10px 0;padding-left: 20px;border-radius: 10px;line-height: 50px;}.item.move {background: transparent;color: transparent;border: 1px dashed #ccc;}</sty…

关于ubuntu18.04 ARM架构更换源失败的问题

更换源后报错&#xff1a; E: Failed to fetch http://mirrors.tuna.tsinghua.edu.cn/ubuntu/dists/trusty-security/main/binary-arm64/Packages 404 Not Found [IP: 2402:f000:1:400::2 80] E: Failed to fetch http://mirrors.tuna.tsinghua.edu.cn/ubuntu/dists/trusty-…