java进阶—代码演示多线程的生命周期

news2024/11/6 9:32:38

前言

回顾一下
到现在,我们已经知道了

  1. 线程的三种创建方式及其选择
  2. 线程的常用方法
  3. 线程的安全问题以及线程的死锁
  4. 线程之间的通信(等待唤醒)

今天,我们一起来看看线程的生命周期,生命周期这个词在后续的javaweb 相关知识点中会经常提起

知己知彼,想要用好线程,就得先了解它

注意:面试要是有问多线程的知识点,这一定会问(建议收藏,面试前拿出来抱抱佛脚)

线程的生命周期

我们来看一段源码,打开thread类的源代码,注意是 lang包下的

在这里插入图片描述
在thread类里面通过关键字搜索

在这里插入图片描述


 public enum State {
        /**
         * Thread state for a thread which has not yet started.
         */
        NEW,

        /**
         * Thread state for a runnable thread.  A thread in the runnable
         * state is executing in the Java virtual machine but it may
         * be waiting for other resources from the operating system
         * such as processor.
         */
        RUNNABLE,

        /**
         * Thread state for a thread blocked waiting for a monitor lock.
         * A thread in the blocked state is waiting for a monitor lock
         * to enter a synchronized block/method or
         * reenter a synchronized block/method after calling
         * {@link Object#wait() Object.wait}.
         */
        BLOCKED,

        /**
         * Thread state for a waiting thread.
         * A thread is in the waiting state due to calling one of the
         * following methods:
         * <ul>
         *   <li>{@link Object#wait() Object.wait} with no timeout</li>
         *   <li>{@link #join() Thread.join} with no timeout</li>
         *   <li>{@link LockSupport#park() LockSupport.park}</li>
         * </ul>
         *
         * <p>A thread in the waiting state is waiting for another thread to
         * perform a particular action.
         *
         * For example, a thread that has called <tt>Object.wait()</tt>
         * on an object is waiting for another thread to call
         * <tt>Object.notify()</tt> or <tt>Object.notifyAll()</tt> on
         * that object. A thread that has called <tt>Thread.join()</tt>
         * is waiting for a specified thread to terminate.
         */
        WAITING,

        /**
         * Thread state for a waiting thread with a specified waiting time.
         * A thread is in the timed waiting state due to calling one of
         * the following methods with a specified positive waiting time:
         * <ul>
         *   <li>{@link #sleep Thread.sleep}</li>
         *   <li>{@link Object#wait(long) Object.wait} with timeout</li>
         *   <li>{@link #join(long) Thread.join} with timeout</li>
         *   <li>{@link LockSupport#parkNanos LockSupport.parkNanos}</li>
         *   <li>{@link LockSupport#parkUntil LockSupport.parkUntil}</li>
         * </ul>
         */
        TIMED_WAITING,

        /**
         * Thread state for a terminated thread.
         * The thread has completed execution.
         */
        TERMINATED;
    }

这是 Thread 类里面的一段枚举,这里的六个状态就是 线程的生命周期,,也可以说是五个状态,因为 waiting 跟 timed_waiting 可以统称为阻塞

这也是为什么有的人说是五个状态,细分就是六个状态

1. new (新建),尚未启动的线程的状态


public class Demo implements Runnable {

    @Override
    public void run() {

    }

    public static void main(String[] args) {
        Demo demo = new Demo();
        Thread thread = new Thread(demo);
        //当前线程状态
        System.out.println(thread.getState());
    }
}

就是我们只是创建线程,并没有 调用start() 开启 线程的状态
输出结果
在这里插入图片描述

2. runnable (就绪),线程已经启动,正在等CPU分配资源,已经调用start()方法后

public class Demo implements Runnable {

    @Override
    public void run() {

    }

    public static void main(String[] args) {
        Demo demo = new Demo();
        Thread thread = new Thread(demo);
        thread.start();
        //当前线程状态
        System.out.println(thread.getState());
    }
}

3.blocked (堵塞) 线程让出自己的执行权

来简单的模拟两个线程在抢占同一个锁


public class Demo  implements Runnable{


    @Override
    public void run() {
        getTime();
    }

    public  synchronized void getTime() {
           while (true){

           }
    }

    public static void main(String[] args) {
        Demo demo =new Demo();
        Thread A =new Thread(demo);
        Thread B =new Thread(demo);

        A.start();
        B.start();

        int i=5;
        while(i-- >0) {
            System.out.println("A的状态"+A.getState());
            System.out.println("B的状态"+B.getState());
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }


}

在这里插入图片描述
可以看到线程进入阻塞状态

3.waiting 线程进入等待状态

让线程进入等待状态你可以使用wait,join ,sleep , park 等等

4.timed_waiting

这个状态与Waiting 状态类似,都是线程处于等待状态,区别是这个状态线程不会进入无限等待状态,比如我们之前使用wait() 让线程进入等待状态,需要notify唤醒,不唤醒他将一直等待下去,然而 当线程TIMED_WAITING 状态,没有完后期望操作,在指定时间内他将会自动转换成Runnable 状态

一般是调用wait(long timeout)

在这里插入图片描述
这个单位是毫秒 ,可以看到原码

在这里插入图片描述

5. terminated 线程进入终止状态

在这里插入图片描述
这个就是线程完成任务,生命周期结束了,执行完run方法,或者调用线程的stop方法,stop方法已经不建议使用,这里提一下,当然出现异常也会使线程终止

为了方便记忆,下面来看一张图解:

我们这边把 waiting 跟 timed_waiting 统一为阻塞状态

在这里插入图片描述
以上就是线程的生命周期

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

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

相关文章

【论文系列解读】LLM构建通用视觉(SUR-Adapter)声音模型(Tango)

通用视觉&音频模型的思考 0. 视觉(Diff)怎么和多模态结合(0) 总结(1) 关键技术(1-1) LangChain(1-2) **Versatile Diffusion**(1-3) Tango(1-4) SUR-adapter 1. SUR-Adapter(0) 总结(1) 摘要(2) 相关工作(2-1) 文图生成 & LLM(2-2) 语义理解和推理数据集(2-2-1) 数据收…

【案例教程】环境多介质逸度模型实践技术与典型案例【代码】应用

【原文链接】&#xff1a;【案例教程】环境多介质逸度模型实践技术与典型案例【代码】应用https://mp.weixin.qq.com/s/i8BpApcz1p4Ua6bytxhGwA 内容简要&#xff1a;【注&#xff1a;提供以下模型所有教程】 专题一&#xff1a;基本理论 1.逸度的定义 2.逸度模型的基本原理…

蓝牙音箱中应用的国产蓝牙芯片

蓝牙音箱指的是内置蓝牙芯片&#xff0c;以蓝牙连接取代传统线材连接的音响设备&#xff0c;通过与手机平板电脑和笔记本等蓝牙播放设备连接&#xff0c;达到方便快捷的目的。蓝牙音箱以便携音箱为主&#xff0c;外形一般较为小巧便携&#xff0c;蓝牙音箱技术也凭借其方便人的…

AI绘画中的负面词 是如何正确使用以及发挥作用

Stable Diffusion的艺术或图像生成&#xff0c;有些参数是必不可少的&#xff0c;其中之一就是负提示。本次将深入解析稳定扩散中的负提示是什么&#xff0c;如何使用这个参数来生成高质量的图像。 文章目录 negative prompt如何正确使用&#xff1f;正面词控制通过负面词控制 …

IP地址、MAC地址、互联网、WLAN、运营商、子网掩码、网络地址、网段、网关、集线器、光纤、基站

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和…

从2PC和容错共识算法讨论zookeeper中的Create请求 | 京东云技术团队

最近在读《数据密集型应用系统设计》&#xff0c;其中谈到了zookeeper对容错共识算法的应用。这让我想到之前参考的zookeeper学习资料中&#xff0c;误将容错共识算法写成了2PC&#xff08;两阶段提交协议&#xff09;&#xff0c;所以准备以此文对共识算法和2PC做梳理和区分&a…

近日网上传出消息,ARM正与Intel共同开发制造芯片

近日网上传出消息&#xff0c;ARM正与Intel共同开发制造芯片&#xff0c;让芯片设计者能够基于Intel 18A制程打造低功耗的SoC。另有多位业内人士透露&#xff0c;这次制造的芯片将主要用于移动设备、笔记本电脑、数据中心等。 若这一消息属实&#xff0c;会对中国芯片行业带来…

常见的SQL优化方案

1. insert优化 1.1 批量插入 我们之前插入数据都是一条一条插入的&#xff0c;会导致频繁操作数据库&#xff0c;从而影响性能。比如遍历某个集合&#xff0c;然后逐个使用insert语句插入数据库表中 INSERT INTO table (name, age) VALUES (张三, 18); INSERT INTO table (na…

6-js基础-3

JavaScript 基础 - 3 知道什么是数组及其应用的场景&#xff0c;掌握数组声明及访问的语法&#xff0c;具备利用数组渲染柱形图表的能力 今日重点&#xff1a; 循环嵌套数组综合案例 今日单词&#xff1a; 循环嵌套 利用循环的知识来对比一个简单的天文知识&#xff0c;我们…

arcpy制作脚本工具相关(制作并添加脚本工具、脚本工具消息提示、arcpy工具自动获取数据)

前言 采用arcpy制作arcgis的脚本工具&#xff0c;记录如下。 一、脚本工具的制作 制作脚本工具分为两步&#xff1a; 1、先编写对应功能的python脚步 2、将对应功能的脚本修改为&#xff0c;能自己手动选择输入输出数据的脚本 3、将修改完的脚本添加到工具箱 1、编写代码 我…

618种草观察丨益生菌「蓝」在一起,酸奶「地域控」?

2023年的“618”&#xff0c;食饮行业中&#xff0c;种草战线格外热闹&#xff0c;品牌花式“开屏”&#xff0c;吸引消费者。 数说故事发布「SMI社媒心智品牌榜」&#xff0c;本期持续关注健康食品&#xff0c;也新增了今夏网红酸奶行业&#xff0c;一起看看这两大赛道中&…

使用power rail连接secondary pg pin的方法

过往文章&#xff1a; secondary pg pin的作用与连接 之前写到过secondary pg pin的种类与几种连接方式&#xff0c;其中使用最多的方法是NDR rule &#xff0b; route_group的方式&#xff0c;这样工作量少&#xff0c;不容易出错&#xff0c;但也有弊端&#xff0c;那就是一…

ctfshow web入门 内网渗透篇

web859 首先ssh连接上之后传个fscan上去&#xff0c;扫描下内网靶机 发现.5和.6的比较可疑。 一个存在web服务&#xff0c;一个存在445端口。 先看下445端口&#xff0c;靶机给我们提供了msf&#xff0c;所以直接用msf打下Samba msfconsole use exploit/linux/samba/is_kno…

数字贸易下转口贸易企业如何高效管理?

什么是转口贸易&#xff1f;是指企业在国内购买进口货物&#xff0c;经过加工、组装、包装等方式改变其性质&#xff0c;再出口到海外市场的贸易活动。这种贸易方式对于促进国际贸易和提高企业竞争力都有着非常重要的作用&#xff0c;但同时也存在着一些风险和难点&#xff0c;…

如何向领导建议数字化转型应着手数据治理?_光点科技

在当今数字化时代&#xff0c;企业的数字化转型已经成为一个迫切的任务。然而&#xff0c;数字化转型不仅仅涉及技术的引入&#xff0c;更需要在数据治理方面进行全面的改进。 一、数据治理是数字化转型的基石。 数据是企业最重要的资产之一&#xff0c;通过对数据的管理和利用…

电气工程师日常工作常遇到的41种接线方法(二)

021 缘耐压测试仪线路 这种绝缘耐压测试仪可测灯具&#xff0c;将待测灯具与A、B两接线柱接好&#xff0c;按下按钮SB1&#xff0c;中间继电器KA1得电并自锁&#xff1b;然后将调压器VT(1∶10&#xff0c;输出0~250V)调至需测的电压值&#xff0c;如需调到1500V则将VT调到电压…

第四章.­ ­ Feasibility of Learning

第四章. Feasibility of Learning 本章主要介绍机器学习的可行性&#xff0c;讨论问题是否可以使用机器学习来解决。 4.1 Learning is Impossible 1.示例描述 1).九宫格样本类型的预测描述&#xff1a; 图中有6个样本&#xff0c;分成两个类别&#xff08;1和-1&#xff09…

pytorch搭建VGG网络

pytorch搭建VGG网络 CNN 感受野VGG-16搭建VGG网络model.pytrain.pypredict.py VGG 网络的创新点&#xff1a;通过堆叠多个小卷积核来替代大尺度卷积核&#xff0c;可以减少训练参数&#xff0c;同时能保证相同的感受野。 例如&#xff0c;可以通过堆叠两个 33 的卷积核替代 5x5…

SpringSecurity6.0+Redis+JWT基于token认证功能开发(可用于实际生产项目,保证API安全)

基于token认证功能开发 引子&#xff1a;最近做项目时遇到了一个特殊的需求&#xff0c;需要写共享接口把本系统的一些业务数据共享给各地市的自建系统&#xff0c;为了体现公司的专业性以及考虑到程序的扩展性&#xff08;通过各地市的行政区划代码做限制&#xff09;&#xf…

Java框架之spring AOP 和 IOC

写在前面 本文一起看下spring aop 和 IOC相关的内容。 1&#xff1a;spring bean核心原理 1.1&#xff1a;spring bean的生命周期 spring bean生命周期&#xff0c;参考下图&#xff1a; 我们来一步步的看下。 1 其中1构造函数就是执行类的构造函数完成对象的创建&#x…