java线程的状态

news2024/11/18 11:17:22

文章目录

    • 1. 线程的状态
    • 2. 验证NEW、RUNNALE和TERMINATED状态
    • 3. 验证TIMED_WAITING状态
    • 4. 验证BLOCKED状态
    • 5. 验证BLOCKED状态

1. 线程的状态

线程在不同的运行时期存在不同的状态,状态信息存在于State枚举类中,如下图:

在这里插入图片描述
调用线程有关的方法是造成线程状态改变的主要原因。State枚举类的源码如下:

 public enum State {
        NEW,
        RUNNABLE,
        BLOCKED,
        WAITING,
        TIMED_WAITING,
        TERMINATED;
    }
  • NEW:至今尚未启动的线程处于这种状态
  • RUNNABLE:正在Java虚拟机中执行的线程处于这种状态
  • BLOCKED:受阻塞并等待某个监视器所的线程处于这种状态
  • WATING:无限期地等待另一个线程来执行某一特定操作的线程处于这种状态
  • TIMED_WAITING:等待另一个线程来执行取决于指定等待时间的操作的线程处于这种状态
  • TERMINATED:已退出的线程处于这种状态

2. 验证NEW、RUNNALE和TERMINATED状态

NEW状态是线程实例化后还未执行start()方法,RUNNALE状态是线程进入运行状态,TERMINATED是线程已被销毁。

public class Main {
    public static void main(String[] args) {
      try{
          MyThread myThread=new MyThread();
          System.out.println("main方法中的状态1(这里获得的是myThread的状态:"+myThread.getState());
          Thread.sleep(1000);
          myThread.start();
          Thread.sleep(1000);
          System.out.println("获得myThread线程的状态(这里获得的是Mythread销毁后的状态):"+myThread.getState());
      }catch (InterruptedException e)
      {
          e.printStackTrace();
      }
    }
}

class MyThread extends Thread{
    public MyThread(){
        System.out.println("获得当前线程的状态(调用该类构造方法的线程仍然是主线程:"+Thread.currentThread().getState());
        System.out.println("通过this获得创建的子线程的状态(也就是当前线程):"+this.getState());
    }
    @Override
    public void run(){
        System.out.println("run方法中的状态,也就是当前线程启动后的状态:"+Thread.currentThread().getState());
    }
}

在这里插入图片描述

3. 验证TIMED_WAITING状态

状态TIMED_WAITING代表线程执行了Thread.sleep()方法,呈等地状态,等待时间达到后继续向下运行:

public class Main {
    public static void main(String[] args) {
      try{
          MyThread myThread=new MyThread();
          myThread.start();
          Thread.sleep(1000);
          System.out.println("获得myThread线程的状态(这里获得的是Mythread销毁后的状态):"+myThread.getState());
      }catch (InterruptedException e)
      {
          e.printStackTrace();
      }
    }
}

class MyThread extends Thread{
    @Override
    public void run(){
        System.out.println("begin sleep");
        try {
            Thread.sleep(10000);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        System.out.println(" end sleep");
    }
}

在这里插入图片描述
执行sleep()后线程的状态是TIMED_WAITING

4. 验证BLOCKED状态

BLOCKED状态出现在某一个线程在等待锁的时候

public class Main {
    public static void main(String[] args) throws InterruptedException {
       MyThread1 t1=new MyThread1();
       t1.setName("a");
       t1.start();
       Thread.sleep(1000);
       MyThread2 t2=new MyThread2();
       t2.setName("b");
       t2.start();
       Thread.sleep(1000);
        System.out.println("Main方法中的t2状态:"+t2.getState());

    }
}

class MyThread1 extends Thread{
    @Override
    public void run(){
       Myservice.ServiceMethod();
    }
}
class MyThread2 extends Thread{
    @Override
    public void run(){
        Myservice.ServiceMethod();
    }
}
class Myservice{
    synchronized static  public void ServiceMethod(){
        try {
            System.out.println(Thread.currentThread().getName()+"进入业务方法!");
            Thread.sleep(10000);
        }catch (InterruptedException e)
        {
            e.printStackTrace();
        }
    }
}

在这里插入图片描述

5. 验证BLOCKED状态

WAITING 是线程执行Object.wait()方法后所处在的状态

public class Main {
    public static void main(String[] args) throws InterruptedException {
     try {
         MyThread t=new MyThread();
         t.start();
         Thread.sleep(1000);
         System.out.println("main方法中t状态:"+t.getState());
     }catch (InterruptedException e){
         e.printStackTrace();
     }

    }
}

class MyThread extends Thread{
    @Override
    public void run(){
      try{
          synchronized (Lock.lock){
              Lock.lock.wait();
          }
      }catch (InterruptedException e)
      {
          e.printStackTrace();
      }
    }
}
class Lock{
    public static final Byte lock=new Byte("0");
}

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

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

相关文章

文心一言 VS 讯飞星火 VS chatgpt (18)-- 算法导论4.1 5题

五、使用如下思想为最大子数组问题设计一个非递归的、线性时间的算法。从数组的左边界开始,由左至右处理,记录到目前为止已经处理过的最大子数组。若已知 A[1…j]门的最大子数组,基于如下性质将解扩展为 A[1…j1]的最大子数组:A[1…j1]的最大…

Squid 代理服务器

Squid概述 Squid 主要提供缓存加速、应用层过滤控制的功能。 代理的工作机制 1.代替客户机向网站请求数据,从而可以隐藏用户的真实IP地址。 2.将获得的网页数据(静态 Web 元素)保存到缓存中并发送给客户机&#xff0…

Windows安装Ubuntu双系统

Windows安装Ubuntu双系统 1.下载Ubuntu 16.04,地址https://releases.ubuntu.com/16.04/ 2.下载Rufus,地址https://rufus.ie/zh/ 3.准备U盘,烧录系统 4.磁盘分区 5.重启,按住shift键 本人电脑是联想小新 Windows11系统&#xff0…

QT上位机串口+STM32单片机项目

第一个自己的上位机小项目,嘿嘿,还是有些成绩感的。 目录 1.先看QT上位机部分 1.首先写一个页面 2.mainwindow.cpp主要函数。 2.form.cpp主要函数 3.STM32部分 1.main函数 3.QT完整代码 1.shangwei.pro 2.form.h 3.mainwindow.h 4.form.cpp …

从零入门激光SLAM(十一)——如何求解SLAM问题

大家好呀,我是一个SLAM方向的在读博士,深知SLAM学习过程一路走来的坎坷,也十分感谢各位大佬的优质文章和源码。随着知识的越来越多,越来越细,我准备整理一个自己的激光SLAM学习笔记专栏,从0带大家快速上手激…

(转载)从0开始学matlab(第9天)—第一阶段总结

1.编程实例 下面的例子将向大家介绍如何用 MATLAB 解决问题。 例1 温度转换程序 问题: 设计一个 MATLAB 程序,读取一个华氏温度的输入,输出开尔文温度。 答案: 华氏温度和开尔文温度的转换关系式可在物理学课本中找到。其关系式…

HCIP-RIP双向重发布综合实验

拓扑结构: 要求: 1、两个协议间进行多点双向重发布 2、R7的环回没有宣告在OSPF协议中,而是在后期重发布进入的 3、解决环路,所有路径选择最优,且存在备份 4、R2的环回要在RIP中宣告,R3的环回要在OSPF中宣…

如何优雅的写C#,使用Visual studio

免责声明 本人接触C#,.Net一年时间,本文内容基于我平时对于C#语法的积累,如有问题请多包涵。以下内容除了C#之外,还有Visual studio编译器相关的内容。 在使用C#的一年多里面,我发现C#的语法糖真的很不错,Visual Stu…

SaaS系统用户权限设计

SaaS系统用户权限设计 学习目标: 理解RBAC模型的基本概念及设计思路 了解SAAS-HRM中权限控制的需求及表结构分析完成组织机构的基本CRUD操作 完成用户管理的基本CRUD操作完成角色管理的基本CRUD操作 组织机构管理 需求分析 需求分析 实现企业组织结构管理&#xff0…

PCB 基础~典型的PCB设计流程,典型的PCB制造流程

典型的PCB设计流程 典型的PCB制造流程 • 从客户手中拿到Gerber, Drill以及其它PCB相关文件 • 准备PCB基片和薄片 – 铜箔的底片会被粘合在基材上 • 内层图像蚀刻 – 抗腐蚀的化学药水会涂在需要保留的铜箔上(例如走线和过孔) – 其他药水…

如何封装React无限滚动加载列表组件【含源码】

前言 由于需要考虑后端接口的性能问题,我们在请求业务数据列表的时候并不能直接请求全量数据。所以我们在请求数据时常见的方式是做分页查询。 对于前端交互而言,我们需要考虑如何优雅的让用户触发请求下一页数据的接口。常用的方法有两种:…

i春秋春季赛2023

只有两道逆向和一道misc,其他的有时间再写 wordle 不断筛有什么和没什么字母猜就行了 [6x] Guess a 5-letter word : first first [5x] Guess a 5-letter word : ideas Please enter a real English word that exists. [5x] Guess a 5-letter word : icily first…

View的基础与滑动

View的基础与滑动 1.View的基础知识 1.1View是什么 View是一种界面层的控件的一种抽象 ,我们知道的大多数控件都是直接或间接继承自View 如EditText,TextView等等 注意: EditText在compose中并没有相关控件,而是通过TextField来进行组合 Android中View本身就可以是单个控…

rt-thread启动流程(最详细教程)

资料下载 RT-Thread Simulator 例程 操作流程 将上面的仿真例程下载并解压,通过MDK打开,编译,调试,并打开串口点击运行,就可以看到如下输出了: 添加自己的 thread:在main()函数中添加即可&am…

【5.19】四、性能测试—流程

4.4 性能测试的流程 性能测试也遵循测试需求分析→测试计划制订→测试用例设计→测试执行→编写测试报告的基本过程,但在实现细节上,性能测试有单独一套流程: 1. 分析性能测试需求 在性能测试需求分析阶段,测试人员需要收集有关…

【AI Earth试玩】权限配置与openAPI调用工具库

前言 AI earth是阿里达摩院出的遥感云计算平台,我简单体验下来感觉像是GEE的python版本遥感深度学习计算平台,整体体验还是挺不错的,尤其是多分类的结果还是挺惊艳的。 平台提供工具箱和notebook两种模式,工具箱整个交互简单易用…

DJ 5-4 以太网 Ethernet

目录 一、以太网的物理拓扑结构 二、以太网物理层标准 1、以太网技术:10Base-T 和 100Base-T 2、以太网技术:1000Base 系列 3、曼彻斯特编码* 4、差分曼彻斯特编码机制* 三、以太网链路层控制技术 四、以太网的帧结构 1、前同步码 2、MAC 地址…

Spring Boot 项目【前后端分离】之后端实现加 LambdaQueryWrapper实现源码分析和手动模拟

目录 Spring Boot 项目【前后端分离】 之架子搭建 技术栈 实现功能03-创建Spring Boot 后端项目 需求分析/图解 思路分析 代码实现 1. 创建springboot_furn 项目 2. 修改pom.xml , 引入mybatis-plus 等相关依赖 3. 创建application.yml 配置port & 配置DB 连接信息…

【数据结构】KMP算法:计算next与nextval函数值(图解)

例&#xff1a;计算模式串"abaabcac"的KMP算法中next函数值 由函数定义 n e x t [ j ] { 0 , j 1 M a x { k ∣ 1 < k < j 且 " t 1 t 2 ⋅ ⋅ ⋅ t k − 1 " " t j − k 1 t j − k 2 ⋅ ⋅ ⋅ t j − 1 " } 1 , k 1 next[j]\left…

asp.net高校运动会管理系统的设计与实现

本高校运动会管理系统是针对我院当前运动会工作需要而开发的B/S模式的网络系统&#xff0c;涉及到运动会赛前的报名录入准备与分组编排、赛中的成绩处理、赛后的成绩汇总与团体总分的统计。它将是一个完整统一、技术先进、高效稳定、安全可靠的基于Internet/Intranet的高校运动…