Java线程的6 种状态

news/2024/10/31 5:31:44/

Java 线程的状态

Java线程有六种状态:
初始(NEW)、运行(RUNNABLE)、阻塞(BLOCKED)、
等待(WAITING)、超时等待(TIMED_WAITING)、终止(TERMINATED)。

  1. 初始状态(NEW)
    实现Runnable接口和继承Thread可以得到一个线程类,new一个实例出来,线程就进入了初始状态。

  2. 运行状态(RUNNABLE)

    • 就绪状态(RUNNABLE之READY)
      就绪状态只是说你资格运行,调度程序没有挑选到你,你就永远是就绪状态。
      调用线程的start()方法,此线程进入就绪状态。
      当前线程sleep()方法结束,其他线程join()结束,等待用户输入完毕,某个线程拿到对象锁,这些线程也将进入就绪状态。
      当前线程时间片用完了,调用当前线程的yield()方法,当前线程进入就绪状态。
      锁池里的线程拿到对象锁后,进入就绪状态。

    • 运行中状态(RUNNABLE之RUNNING)
      线程调度程序从可运行池中选择一个线程作为当前线程时线程所处的状态。这也是线程进入运行状态的唯一的一种方式。

  3. 阻塞状态(BLOCKED)
    阻塞状态是线程阻塞在进入synchronized关键字修饰的方法或代码块(获取锁)时的状态。

  4. 等待(WAITING)
    处于这种状态的线程不会被分配CPU执行时间,它们要等待被显式地唤醒,否则会处于无限期等待的状态。

  5. 超时等待(TIMED_WAITING)
    处于这种状态的线程不会被分配CPU执行时间,不过无须无限期等待被其他线程显示地唤醒,在达到一定时间后它们会自动唤醒。

  6. 终止状态(TERMINATED)

    • 当线程的run()方法完成时,或者主线程的main()方法完成时,我们就认为它终止了。这个线程对象也许是活的,但是它已经不是一个单独执行的线程。
    • 线程一旦终止了,就不能复生。
    • 在一个终止的线程上调用start()方法,会抛出java.lang.IllegalThreadStateException异常。

线程状态图:
在这里插入图片描述


对于几个阻塞状态的示例:

package demo;import jdk.nashorn.internal.ir.Block;import java.util.concurrent.TimeUnit;public class ThreadDemo {public static void main(String[] args) {//该线程在main方法开始执行后就通过sleep(100)进入到 Timed_waiting 状态new Thread(()->{while(true){try {TimeUnit.SECONDS.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}}},"thread_01").start();//该线程因为Synchronized,进入WAITING状态new Thread(()->{while(true){synchronized (ThreadDemo.class){try {ThreadDemo.class.wait();} catch (InterruptedException e) {e.printStackTrace();}}}},"thread_02").start();//进入timed_waiting状态new Thread(new BlockDemo(),"BlockDemo-01").start();//进入block状态new Thread(new BlockDemo(),"BlockDemo-02").start();}static class BlockDemo extends Thread{@Overridepublic void run() {synchronized (BlockDemo.class){while(true){try {TimeUnit.SECONDS.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}}}}}
}

我们通过jstack来查看他们的线程状态。
进入类目录,执行jps

D:\open_source\MyBatis\MyThread\target\classes\demo>jps
11776
20832 ThreadDemo
7856 Jps
21876 Launcher
27432 RemoteMavenServer36

执行 jstack 20832

D:\open_source\MyBatis\MyThread\target\classes\demo>jstack 20832
2023-02-20 00:30:44
Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.351-b10 mixed mode):"DestroyJavaVM" #18 prio=5 os_prio=0 tid=0x0000029032cf9000 nid=0x6a68 waiting on condition [0x0000000000000000]java.lang.Thread.State: RUNNABLE"BlockDemo-02" #17 prio=5 os_prio=0 tid=0x000002904ff83800 nid=0x6f30 waiting for monitor entry [0x000000c5215ff000]java.lang.Thread.State: BLOCKED (on object monitor)at demo.ThreadDemo$BlockDemo.run(ThreadDemo.java:41)- waiting to lock <0x000000076c8bca88> (a java.lang.Class for demo.ThreadDemo$BlockDemo)at java.lang.Thread.run(Thread.java:750)"BlockDemo-01" #15 prio=5 os_prio=0 tid=0x000002904ff78800 nid=0x18f0 waiting on condition [0x000000c5214fe000]java.lang.Thread.State: TIMED_WAITING (sleeping)at java.lang.Thread.sleep(Native Method)at java.lang.Thread.sleep(Thread.java:342)at java.util.concurrent.TimeUnit.sleep(TimeUnit.java:386)at demo.ThreadDemo$BlockDemo.run(ThreadDemo.java:41)- locked <0x000000076c8bca88> (a java.lang.Class for demo.ThreadDemo$BlockDemo)at java.lang.Thread.run(Thread.java:750)"thread_02" #13 prio=5 os_prio=0 tid=0x000002904ff78000 nid=0x4c28 in Object.wait() [0x000000c5213fe000]java.lang.Thread.State: WAITING (on object monitor)at java.lang.Object.wait(Native Method)- waiting on <0x000000076c59bdf0> (a java.lang.Class for demo.ThreadDemo)at java.lang.Object.wait(Object.java:502)at demo.ThreadDemo.lambda$main$1(ThreadDemo.java:23)- locked <0x000000076c59bdf0> (a java.lang.Class for demo.ThreadDemo)at demo.ThreadDemo$$Lambda$2/1078694789.run(Unknown Source)at java.lang.Thread.run(Thread.java:750)"thread_01" #12 prio=5 os_prio=0 tid=0x000002904ff75000 nid=0x1c90 waiting on condition [0x000000c5212ff000]java.lang.Thread.State: TIMED_WAITING (sleeping)at java.lang.Thread.sleep(Native Method)at java.lang.Thread.sleep(Thread.java:342)at java.util.concurrent.TimeUnit.sleep(TimeUnit.java:386)at demo.ThreadDemo.lambda$main$0(ThreadDemo.java:12)at demo.ThreadDemo$$Lambda$1/1324119927.run(Unknown Source)at java.lang.Thread.run(Thread.java:750)

各个线程的状态一目了然。


http://www.ppmy.cn/news/26839.html

相关文章

【Spring6】| Spring启示录、Spring概述

目录 一&#xff1a;Spring启示录 1. OCP开闭原则 2. 依赖倒置原则DIP 3. 控制反转IoC 二&#xff1a;Spring概述 1. Spring简介 2. Spring8大模块 3. Spring特点 一&#xff1a;Spring启示录 引言&#xff1a;前面我们已经学习了三层架构&#xff1a;表示层、业务层、…

使用 PyTorch+LSTM 进行单变量时间序列预测(附完整源码)

时间序列是指在一段时间内发生的任何可量化的度量或事件。尽管这听起来微不足道&#xff0c;但几乎任何东西都可以被认为是时间序列。一个月里你每小时的平均心率&#xff0c;一年里一只股票的日收盘价&#xff0c;一年里某个城市每周发生的交通事故数。 在任何一段时间段内记…

SQL零基础入门学习(四)

SQL零基础入门学习&#xff08;三&#xff09; SQL INSERT INTO 语句 INSERT INTO 语句用于向表中插入新记录。 SQL INSERT INTO 语法 INSERT INTO 语句可以有两种编写形式。 第一种形式无需指定要插入数据的列名&#xff0c;只需提供被插入的值即可&#xff1a; INSERT …

基于Django的员工管理系统

目录 一、新建项目 二、创建app 三、设计表结构 四、在MySQL中生成表 五、静态文件管理 六、添加页面 七、模板的继承 一、新建项目 django-admin startproject 员工管理系统 二、创建app startapp app01 三、设计表结构 app01/migrations/models.py from django.db impo…

K8s中gRpc通信负载均衡失效

上篇文章在做 整合K8sSpringCloudK8sSpringBootgRpc 时&#xff0c;发现K8s中使用gRpc通信&#xff0c;负载均衡功能失效查了下gRpc的最佳实践&#xff0c;找到这里Load balancingSome load balancers dont work effectively with gRPC. L4 (transport) load balancers operate…

一月券商金工精选

✦研报目录✦ ✦简述✦ 按发布时间排序 国盛证券 “薪火”量化分析系列研究&#xff08;二&#xff09;-票据逾期数据中的选股信息 发布日期&#xff1a;2023-01-04 关键词&#xff1a;股票、票据、票据预期 主要内容&#xff1a;本文深入探讨了“票据持续逾期名单”这一…

独立搭建 handle server

本节主要介绍,如何搭建一个与 GHR隔离的 handle sever,不与外界有任何连通。 下载文件 访问地址下载最新版:http://www.handle.net/download_hnr.html 这里以 9.3.0 版本作为讲解 解压服务端,解压客户端 # 解压 tar -xzvf handle-9.3.0-distribution.tar.gz# 到目录下 …

如何选择靠谱的插画培训课程

如何选择靠谱的插画培训课程&#xff0c;今天教你3个维度选择一个靠谱的插画培训班&#xff01; 插画培训机构课程&#xff1a; 1.选择插画培训班时&#xff0c;要先考察课程&#xff0c;看看课程内容是否符合自己的需求&#xff0c;是否有助于提高插画技术。课程设置应该灵活…