Java线程的6中状态

news2024/9/21 10:42:42

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{
        @Override
        public 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.coloradmin.cn/o/359725.html

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

相关文章

layui框架学习(8:动态操作选项卡)

Layui官网示例&#xff08;参考文献3&#xff09;中的选项卡部分除了介绍选项卡的样式外&#xff0c;还介绍了新增选项卡、删除选项卡、切换选项卡等动态操作选项卡方式&#xff0c;主要调用element模块中与选项卡相关的函数实现&#xff0c;除此之外&#xff0c;element模块还…

树莓派下安装OpenEuler

openEuler作为华为开源的应用于嵌入式设备的操作系统&#xff0c;正在受到越来越多的关注。树莓派是一个很好的应用场景&#xff0c;这篇文章就介绍下如何在树莓派上安装openEuler。   ps&#xff1a;openEuler要求树莓派的版本是4B 1.下载openEuler镜像 镜像网址&#xff1…

【K哥爬虫普法】百度、360八年乱战,robots 协议之战终落幕

我国目前并未出台专门针对网络爬虫技术的法律规范&#xff0c;但在司法实践中&#xff0c;相关判决已屡见不鲜&#xff0c;K哥特设了“K哥爬虫普法”专栏&#xff0c;本栏目通过对真实案例的分析&#xff0c;旨在提高广大爬虫工程师的法律意识&#xff0c;知晓如何合法合规利用…

大数据框架之Hadoop:MapReduce(三)MapReduce框架原理——MapReduce工作流程

1、流程示意图 MapReduce详细工作流程&#xff08;一&#xff09; MapReduce详细工作流程&#xff08;二&#xff09; 2、流程详解 上面的流程是整个MapReduce最全工作流程&#xff0c;但是Shuffle过程只是从第7步开始到第16步结束&#xff0c;具体Shuffle过程详解&#xff0…

作为Linux C/C++程序员必备的工具

Linux系统 可以选择centOS或者ubautu server(不建议选择桌面版本的)。不建议裸机安装&#xff0c;玩坏了就特别麻烦。不建议使用有桌面版本的ubautu&#xff0c;在一定程度有桌面的版本的会消耗性能。 如果经济实力允许&#xff0c;可以购买云服务器。 参考文章: Ubuntu server…

一款基于各大企业信息API渗透工具

功能 剑指HW/SRC&#xff0c;解决在HW/SRC场景下遇到的各种针对国内企业信息收集难题 使用支持以下API&#xff0c;并支持合并数据导出 爱企查 (未登陆信息带*) 企查查&#xff08;签名失效&#xff09; 天眼查 阿拉丁 酷安市场 七麦数据 站长之家 veryvp 查询信息 IC…

15-基础加强3-单元测试日志

文章目录1.单元测试1.1概述【理解】1.2特点【理解】1.3使用步骤【应用】1.4相关注解【应用】2.日志2.1概述【理解】2.2日志体系结构和Log4J【理解】2.3入门案例【应用】1.单元测试 1.1概述【理解】 JUnit是一个 Java 编程语言的单元测试工具。JUnit 是一个非常重要的测试工具…

荧光标记ATTO647N NHS,ATTO 647N SE,ATTO 647N-琥珀酰亚胺酯用于单分子检测

【中文名称】 ATTO 647N-琥珀酰亚胺酯&#xff0c;ATTO 647N-活性酯【英文名称】 ATTO 647N-NHS&#xff0c;ATTO 647N NHS&#xff0c;ATTO 647N SE&#xff0c;ATTO 647N-NHS ester【光谱图】【CAS号】N/A【分子式】C46H55ClN4O5【分子量】779.41【基团部分】 ATTO【纯度标准…

5.6配置BGP联邦和团体属性

5.3.3配置BGP联邦和团体属性 1. 实验目的 熟悉BGP联邦和团体属性的应用场景掌握BGP联邦和团体属性的配置方法2. 实验拓扑 实验拓扑如图5-6所示: 图5-6:配置BGP联邦和团体属性 3. 实验步骤 (1)IP地址的配置 R1的配…

【Jmatpro 10.0】根据材料牌号输出应力-应变曲线

我的主页&#xff1a; 技术邻&#xff1a;小铭的ABAQUS学习的技术邻主页博客园 : HF_SO4的主页哔哩哔哩&#xff1a;小铭的ABAQUS学习的个人空间csdn&#xff1a;qgm1702 博客园文章链接&#xff1a; https://www.cnblogs.com/aksoam/p/17121006.html 1.前提条件 Jmatpro …

复盘会如何开出新花样?10种方式让你开出让人惊喜的复盘会【附复盘问题列表】

复盘是每个PMO和项目经理必备的技能之一&#xff0c;咱们分享过很多复盘的技巧和方法&#xff0c;如下&#xff1a;但是大家都会有个问题&#xff0c;那就是复盘形式单一&#xff0c;团队复盘几次就会失去兴趣&#xff1f;失去兴趣之后效果自然不会太好&#xff0c;如何把让大家…

C++设计模式(17)——备忘录模式

亦称&#xff1a; 快照、Snapshot、Memento 意图 备忘录模式是一种行为设计模式&#xff0c; 允许在不暴露对象实现细节的情况下保存和恢复对象之前的状态。 问题 假如你正在开发一款文字编辑器应用程序。 除了简单的文字编辑功能外&#xff0c; 编辑器中还要有设置文本格…

字符设备驱动基础(三)

目录 一、上下文和并发场合 二、中断屏蔽&#xff08;了解&#xff09; 三、原子变量&#xff08;掌握&#xff09; 四、自旋锁&#xff1a;基于忙等待的并发控制机制 五、信号量&#xff1a;基于阻塞的并发控制机制 六、互斥锁&#xff1a;基于阻塞的互斥机制 七、选择…

PMP备考经验—做题方法总结

考题类型 ITTO题 根据关键字考工具技术&#xff0c;输入输出的&#xff0c;所以掌握关键字是重点&#xff0c;典型的ITTO有六个&#xff1a;收集需求工具、质量管理工具、团队建设工具、管理团队的冲突跟了、风险应对的策略以及合同类型。PS&#xff1a;答案是工具技术或者文…

SVN无法连接到服务器的各种问题原因及解决办法

SVN专业使用教程详解 第一节 安装VisualSVN Server服务器 第一步 下载SVN服务器&#xff0c;需要链接的请私信。 点击下载的执行文档进行安装 选择组件 选择在部署 VisualSVN Server 时安装VisualSVN Server 和 Administration Tools 组件。 调整初始服务器配置 或者&…

带你一步步搭建Web自动化测试框架

测试框架的设计有两种思路&#xff0c;一种是自底向上&#xff0c;从脚本逐步演变完善成框架&#xff0c;这种适合新手了解框架的演变过程。另一种则是自顶向下&#xff0c;直接设计框架结构和选取各种问题的解决方案&#xff0c;这种适合有较多框架事件经验的人。本章和下一张…

【Django】缓存、中间件、分页、生成csv文件

一、缓存 定义&#xff1a;可以更快的读取数据的介质。一般用来存储临时数据&#xff0c;常用介质的是读取数据很快的内存。 缓存场景&#xff1a; 1、博客列表页 2、电商商品详情页 场景特点&#xff1a;缓存的地方&#xff0c;数据变动频率较少 1、数据库缓存 当把一次负…

研究 “B表里的数据是否全部都在A表里“ 的问题

背景 研究 “B表里的数据是否全部都在A表里” 的问题&#xff0c;那种写法比较合理效率高&#xff1f; 假设有A表和B表&#xff0c;B表通过自身外键和A表关联&#xff0c;查出B表中的外键值不在A中的。 过程 假设我们有t_master和t_pet表&#xff0c;即主人和宠物表&#x…

TPM密钥管理、使用

前面讲过证书相关内容&#xff0c;除了在软件方面有所应用外&#xff0c;在硬件方面也有很多应用。本次讲一下TPM相关的内容。 一、TPM介绍 1.1背景 TCG基于硬件安全的架构是为应对1990s后期日益增多的复杂恶意软件攻击应用而生的。当时以及现在&#xff0c;抵御PC客户端网络…

蓝桥杯刷题025——推导部分和(加权并查集)

2022省赛 问题描述 对于一个长度为 N 的整数数列 ​, 小蓝想知道下标 l 到 r 的部 分和是多少? 然而, 小蓝并不知道数列中每个数的值是多少, 他只知道它的 M 个部分和 的值。其中第 i 个部分和是下标 ​ 到 的部分和 , 值是 。 输入格式 第一行包含 3 个整数 N、M 和 Q 。分…