Java多线程技术六——线程的状态(备份)

news2025/2/7 12:42:41

 1  概述

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

bb76d05206ea4f9c9dcaac08d29dfcb9.jpeg

        每个状态的解释如下图

7e5f6011aaa844888371b4b2902201c5.jpeg

 调用于线程有关的方法是造成线程状态改变的主要原因,因果关系如下图

dff5c1ebca0441bb89500527c227fe56.jpeg         从上图可知,在调用与线程有关的方法后,线程会进入不同的状态。这些状态之间有些是双向切换,比如WAITING和RUNNING状态之间可以循环地进行切换,而有些是单向切换,比如线程销毁(TERMINATED状态)后,并不能自动进入RUNNING状态。下面将对6中线程状态用代码的方式进行验证。

2 验证NEW RUNNABLE 和 TERMINATED

        了解线程的状态有助于程序员监控线程对象所处的情况,比如哪些线程从未启动,哪些线程正在执行,哪些线程正在组赛等等。

        首先验证的是NEW RUNNABLE 和 TERMINATED 状态。NEW状态是线程实例化后还未执行start()方法,RUNNABLE状态是线程进入运行状态,TERMINATED是线程已被销毁。

public class MyThread extends Thread{
    public MyThread() {
        System.out.println("Thread.currentThread().getState() 构造方法中的状态是:" + Thread.currentThread().getState());
        System.out.println("this.getState 构造方法中的状态是:" + this.getState());
    }

    @Override
    public void run(){
        System.out.println("run方法中的状态是: " + Thread.currentThread().getState());
    }
}
public class Run1 {
    public static void main(String[] args) {
        try {
            MyThread t1 = new MyThread();
            System.out.println("main方法中的状态1? " + t1.getState());
            Thread.sleep(1000);
            t1.start();
            Thread.sleep(1000);
            System.out.println("main方法中的状态? " + t1.getState());
        }catch (InterruptedException e){
            e.printStackTrace();
        }
    }
}

0aa410fb93da46f8902d642b5f7b2daf.png

3 验证TIMED_WAITING

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

public class MyThread extends Thread{
    @Override
    public void run(){
        try {
            System.out.println("begin sleep");
            Thread.sleep(1000);
            System.out.println("end sleep");
        }catch (InterruptedException e){
            e.printStackTrace();
        }
    }
}
public class Run1 {
    public static void main(String[] args) throws InterruptedException {
        MyThread t1 = new MyThread();
        t1.start();
        Thread.sleep(100);
        System.out.println("main方法中的状态:" + t1.getState());
    }
}

6cf7fab7f32c4ce0ae3c251047a1f478.png

4 验证BLOCKED

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

public class MyService {
    synchronized static public void serviceMethod(){
        try {
            System.out.println(Thread.currentThread().getName() + "进入业务方法");
            Thread.sleep(10000);
        }catch (InterruptedException e){
            e.printStackTrace();
        }
    }
}
public class MyThread extends Thread{
    @Override
    public void run(){
        MyService.serviceMethod();
    }
}
public class MyThread2 extends Thread{
    @Override
    public void run(){
        MyService.serviceMethod();
    }
}
public class Run1 {
    public static void main(String[] args) throws InterruptedException {
        MyThread t1 = new MyThread();
        t1.setName("t1");
        t1.start();
        Thread.sleep(1000);
        MyThread2 t2 = new MyThread2();
        t2.setName("t2");
        t2.start();
        Thread.sleep(1000);
        System.out.println("main方法中t2状态是:" + t2.getState());
    }
}

b5a6662d56f84270881711481a54fcd0.png

        从控制台打印结果看,t2线程一直在等待t1线程释放锁,所以t2当时的状态是BLOCKED。

5 验证WAITING

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

public class Lock {
    public static final String lock = new String("0");
}

public class MyThread extends Thread{
    @Override
    public void run(){
        try {
            synchronized (Lock.lock){
                Lock.lock.wait();
            }
        }catch (InterruptedException e){
            e.printStackTrace();
        }
    }
}
public class Run1 {
    public static void main(String[] args) throws InterruptedException {
        MyThread t = new MyThread();
        t.start();
        Thread.sleep(1000);
        System.out.println("main方法中的t状态是:" + t.getState());
    }
}

f644dcc6a584472cb17ab158a4e51959.png

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

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

相关文章

Scikit-Learn线性回归(一)

Scikit-Learn线性回归一 1、线性回归概述1.1、回归1.2、线性1.3、线性回归1.4、线性回归的优缺点1.5、线性回归与逻辑回归2、线性回归的原理2.1、线性回归的定义与原理2.2、线性回归的损失函数3、Scikit-Learn线性回归3.1、Scikit-Learn线性回归API3.2、Scikit-Learn线性回归初…

mac终端自定义登录欢迎语

shigen坚持更新文章的博客写手,擅长Java、python、vue、shell等编程语言和各种应用程序、脚本的开发。记录成长,分享认知,留住感动。 shigen看着单调的终端,突然有了一丝丝的念头,我要搞的炫酷一点。让我想到的一个场景…

VMvare虚拟机之文件夹共享与防火墙设置

共享文件夹 什么是共享文件夹 共享文件夹是一种在网络上共享文件和文件夹的方法。它允许多个用户通过网络连接到共享文件夹,并可以访问其中的文件和文件夹,进行文件的读取、修改、删除等操作。共享文件夹可以用于方便地共享文件和协作工作,…

STL:std::array 和 基本数组类型array 浅谈一二三

一、优缺点比较 在C中,std::array是标准库提供的数组容器,相比于基础数据类型的数组,它具有以下优点和缺点: 优点: 安全性:std::array提供了边界检查,可以避免数组越界访问的问题。 可以作为…

在Centos7中利用Shell脚本:实现MySQL的数据备份

目录 自动化备份MySQL 一.备份数据库脚本 1.创建备份目录 2.创建脚本文件 3.新建配置文件(连接数据库的配置文件) 4.给文件权限(mysql_backup.sh) ​编辑 5.执行命令 (mysql_backup.sh) ​编辑 二.数据库通过备份恢复 1.创建脚…

jsonhandle 插件下载

网盘地址: 链接:https://pan.baidu.com/s/1hj4GKuGNyDNP2JzsJTLFtg 提取码:87rw 1.打开谷歌浏览器,选择扩展程序,记得选择为开发者模式,然后把下载好的CRX文件拖进去就行了

TCP通信流程

// TCP 和 UDP -> 传输层的协议 UDP : 用户数据报协议,面向无连接,可以单播,多播,广播, 面向数据报,不可靠(接受方不会存储数据,也没有拥塞控制)。效率高&#xff…

二维码智慧门牌管理系统升级:高效授权精准控制

文章目录 前言一、精确权限控制二、角色权限受限与透明操作三、提升工作效率与安全性 前言 二维码智慧门牌管理系统在企业管理中扮演着愈发重要的角色。通过系统升级,管理员可以配置权限角色,为单个或多个用户赋权,实现精准控制,…

如何进行镜像管理

目录 镜像管理 创建自定义镜像 自定义镜像管理 自定义镜像管理方法 对于传统的物理服务器,就要基于现有服务器磁盘制作操作系统镜像,系统镜像可以简单理解成把操作系统中包含的一系列文件通过镜子映射出一模一样的文件并进行打包压缩,就变…

Flowable-升级为7.0.0.M2-第二节

目录 替换变化的类和配置把javax.servlet 替换为 jakarta.servlet修改redis的配置配置logging.level.org.springframework.boot.autoconfigureerror避免影响视听 替换变化的类和配置 把javax.servlet 替换为 jakarta.servlet import javax.servlet.ServletContext; import ja…

AI赋能金融创新:ChatGPT引领量化交易新时代

文章目录 一、引言二、ChatGPT与量化交易的融合三、实践应用:ChatGPT在量化交易中的成功案例四、挑战与前景五、结论《AI时代Python量化交易实战:ChatGPT让量化交易插上翅膀》📚→ [当当](http://product.dangdang.com/29658180.html) | [京东…

【JavaScript】原型对象 => 原型链的深入浅出解读

文章目录 先知概念:原型 prototype隐式原型 __ proto __原型链 先知概念: 在了解原型与原型链之前,我们应该要先明确以下几个概念: 1. 在 JS中 所有的普通对象 都是 通过 new 一个函数来创建的。 2. 在 JS中 所有的函数 本质上也是…

开源问答类知识网站源码系统 附带完整的搭建教程

人们对知识的需求和获取方式也在发生改变。问答类知识网站成为了人们获取答案、解决问题的重要途径之一。然而,由于问答类知识网站需要处理大量的用户提问和回答,因此对于技术的要求也相对较高。小编给大家分享一款开源问答类知识网站源码系统&#xff0…

【Git版本控制】

Day10_Git版本控制 知识点01:课程内容大纲与学习目标 #课程内容大纲版本控制工具Git ​ #学习目标了解下git的背景以及作用了解下git基本使用 知识点02:项目开发中的版本问题 目标:了解项目开发中遇到的开发版本问题 举例:你在大…

广播测试信令记录一文全解

语音广播基本要求 语音广播功能实现用户通过语音输入设备向前端语音输出设备的语音广播。语音流发送者向语音流接收者发送通知消息,语音流接受者在收到通知消息后,进行判断处理。若能够接收广播,则向语音流发送者发起呼叫请求,获…

408数据结构错题知识点拾遗

408相关: 408数据结构错题知识点拾遗 408计算机网络错题知识点拾遗 对于数据结构的学习,个人认为要对概念性的东西进行理解,特别是树的性质、图的相关性质和考察的相应算法。应用题强化的话,对于每一章节尾的应用小节&#xff0c…

【开源】基于JAVA的学校热点新闻推送系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 新闻类型模块2.2 新闻档案模块2.3 新闻留言模块2.4 新闻评论模块2.5 新闻收藏模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 新闻类型表3.2.2 新闻表3.2.3 新闻留言表3.2.4 新闻评论表3.2.5 新闻收藏表 四、系统展…

Unity网格篇Mesh(一)

Unity网格篇Mesh(一) 本文的目标1.渲染仔细看下面的图你会发现,锯齿状 2.创建网格顶点4 x 2网格网格的顶点 3.创建网格网格只在Play模式下显示逆时针和顺时针三角形第一个三角面一个四边形由两个三角面组成第一个四边形填充剩余网格 接下一篇…

Vue使用Element表格Table设置所有单元格内容居中对齐

为单个列的单元格设置居中对齐代码如下&#xff1a; <el-table-columnprop"productInfo.productName"label"中文名"width"100"align"center"></el-table-column>需要设置el-table-column标签里面的属性设置为align"c…

Jenkins Tutorial

什么是Jenkins Jenkins是一个自动化平台&#xff0c;它允许你使用pipelines去部署应用。它也可以自动化其他任务。 BUILDTESTDEPLOYMENT Jenkins 架构 首先&#xff0c;你拥有一个Master Server&#xff0c;它控制pipelines和安排Build到你的Agent上&#xff1b; 其次&…