线程的六种状态及其状态的转换

线程生命周期,五大状态转换分析 一、线程生命周期 一个完整的线程生命周期,要经过新建(new)、就绪(Runnable)、运行(Running)、阻塞(Blocked)和死亡(Dead)5种状态。 1.new阶段 new阶段就是你new Thread()创建线程对象时候的阶段。 划重点了 new阶段下其实线程根本还是不存在的,我们只是创建了一个Therad对象,就和我们最常用的new关键字是一个道理。 只有当我们真正把线程启动起来的时候,此时才会在JVM进程中把我们的线程创建出来。 我们new了一个Thread对象之后. 阅读详情

 

Fuzz_ 2018-10-04 18:15:26  9830  已收藏 13
展开
1.线程自身信息
线程运行的过程会产生很多信息,这些信息都保存在Thread类中的成员变量里面,常见的有:

线程的ID是唯一标识getId()
线程的名称:getName(),如果不设置线程名称默认为“Thread-xx”
线程的优先级:getPriority,线程优先级从1-10,其中数字越大表示优先级别越高,同时获得JVM调度执行的可能性越大,JDK内置了三种常见的状态:
//最小优先级
public final static int MIN_PRIORITY = 1;
 
//一般优先级
public final static int NORM_PRIORITY = 5;
 
//最大优先级
public final static int MAX_PRIORITY = 10;
 一般不推荐设置线程的优先级,如果进行设置了非法的优先级程序就会出现IllegalArgumentException异常。

2.线程的几个状态
1.Java线程有六种状态

public enum State {
    //线程刚创建
    NEW,
 
    //在JVM中正在运行的线程
    RUNNABLE,
 
    //线程处于阻塞状态,等待监视锁,可以重新进行同步代码块中执行
    BLOCKED,
 
    //等待状态
    WAITING,
 
    //调用sleep() join() wait()方法可能导致线程处于等待状态
    TIMED_WAITING,
 
    //线程执行完毕,已经退出
    TERMINATED;
}
上面六种状态图如下:

2.线程状态的解释

1.当线程继承Thread或者实现了Runnable创建了线程对象后,当new线程对象过后线程就进入了初始的状态。

2.当线程对象调用了start()方法的时候,线程启动进入可运行的状态。

3.线程进入可运行状态后,如果逻辑完成那么线程将会终结,如果没有执行完毕中间JVM分配时间片用完,将进入可运行状态,一旦线程被JVM选中则立即执行。

4.运行状态的情况比较复杂
第一:线程如果执行run() main()方法结束后,完成逻辑,线程就进入Terminated

第二:当线程调用sleep()或者join()方法就会进入Blocked状态,但是要注意的是阻塞的线程是不释放当前所占有的系统资源,当sleep()结束或者join()等待其他线程来到,当前线程则进入Runnable状态等待JVM分配资源。

第三:当线程进入Runnable状态,但是还没有开始运行的时候,此时发现需要的资源处于同步状态synchronized,这个时候线程将会进入Time waiting,JVM会使用队列对这些线程进行控制,既先进行Time waiting的线程会先得到JVM资源进行执行进入Waiting

第四:如果处于Runnable的线程调用yield()让出JVM资源,那么就会进入New状态和其他New状态线程进行竞争重新进入Runnable

第五:如果当前线程调用wait()方法,则当前线程进入Time waiting但是这个时候当前线程会释放所占有的JVM资源,进入这个状态过后是不能自动唤醒的,必须调用notify()或者notifyAll()方法,线程进入Waiting。

3.案例解释 
案例:用案例解释线程的六种运行状态,其中Pig类实现Runnable接口,逻辑是打印当前运行的线程信息,
每隔一秒打印一次。在Main方法中启动十个Pig线程设置相应的线程优先级别,并且将初始的线程状态
保存到线程状态数组中,在运行的过程判断当前线程状态和初始状态是否相同,如果不同则打印当前线
程的信息保存到日志文件中。
 

import java.io.FileWriter;
import java.io.PrintWriter;
import java.lang.Thread.State;
import java.util.concurrent.TimeUnit;
 
class Pig implements Runnable {
 
    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            try {
                //线程进行休眠一秒
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            //打印当前执行线程信息
            System.out.println("ThreadName :  "+ Thread.currentThread().getName());
        }
    }
}
 
public class App {
    public static void main(String[] args) throws Exception {
        // 创建现成数组
        Thread[] taskArr = new Thread[10];
 
        // 线程状态数组
        Thread.State[] threadStates = new Thread.State[10];
 
        // 设置线程的状态
        for (int i = 0; i < 10; i++) {
            taskArr[i] = new Thread(new Pig());
 
            // 分别设置状态
            if ((i % 3) == 0) {
                taskArr[i].setPriority(Thread.NORM_PRIORITY);
            } else if ((i % 3) == 1) {
                taskArr[i].setPriority(Thread.MIN_PRIORITY);
            } else if ((i % 3) == 2) {
                taskArr[i].setPriority(Thread.MAX_PRIORITY);
            }
        }
 
        // 将线程信息写入到文件中便于分析
        FileWriter fWriter = new FileWriter("F:/log.txt");
        PrintWriter pWriter = new PrintWriter(fWriter);
 
        // 循环遍历获取线程的信息
        for (int i = 0; i < 10; i++) {
            pWriter.println("线程  "+ i + " 状态:" + taskArr[i].getState());
 
            // 将当前线程状态保存到状态数组中
            threadStates[i] = taskArr[i].getState();
        }
 
        // 启动线程
        for (int i = 0; i < 10; i++) {
            taskArr[i].start();
        }
 
        // 在运行过程中如果线程的状态和初始状态不一样就将状态变化过程写入到文件中
        boolean finish = false;
 
        while (!finish) {
            for (int i = 0; i < 10; i++) {
                // 线程状态发生变化
                if (taskArr[i].getState() != threadStates[i]) {
                    // 打印线程当前信息
                    printThreadMsg(pWriter, taskArr[i], threadStates[i]);
 
                    // 将当前线程状态保存到线程状态数组中
                    threadStates[i] = taskArr[i].getState();
                }
            }
            finish = true;
            for (int i = 0; i < 10; i++) {
                finish = finish && (taskArr[i].getState() == State.TERMINATED);
            }
        }
    }
 
    /**
     * 打印当前线程的信息
     * @param pWriter
     * @param thread
     * @param state
     */
    private static void printThreadMsg(PrintWriter pWriter, Thread thread, State state) {
        pWriter.println("*********************************************************");
        pWriter.println("线程ID:  "+ thread.getId() +"  线程名称: "+ thread.getName());
        pWriter.println("线程优先级: "+ thread.getPriority());
        pWriter.println("线程过去状态:" + state);
        pWriter.println("线程当前状态: "+ thread.getState());
        pWriter.println("*********************************************************");
    }
}
 

 

分析上面的部分执行结果就可以看出当Pig线程进行休眠的时候,就会导致其他线程状态的变换,其中过去状态和当前状态可以明显的反应出线程状态切换。 
————————————————
版权声明:本文为优快云博主「Fuzz_」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/qq_36186690/article/details/82939190

大模型训练(1):流水线并行 Gpipe的方法是,在训练时计算和运用的是micro-batch里的均值和方差,但同时持续追踪全部mini-batch的移动平均和方差,以便在测试阶段进行使用。流水线并行的核心思想是:在模型并行的基础上,进一步引入数据并行的办法,即把原先的数据再划分成若干个更小的batch,分批送入GPU进行训练,算一部分就让下一个GPU动起来。从实验结果可知,在关掉NVlinks的情况下,Gpipe一样也能实现随着GPU数量的增加,训练速度也增加的效果。前文说过,随着模型的增加,每块GPU中存储的中间结果也会越大。 阅读详情

相关推荐

Linux -- 图形界面配置Samba;system-config-samba工具

图形界面配置Samba6.6.1 system-config-sambasystem-config-samba是Red Hat公司专门为Samba服务器管理编写的图形界面的管理工具,通过system-config-samba几乎可以完成对Samba服务器的所有配置,所以在只希望通过Samba服务器实现一些简单的资源共享时,system-config-samba是一个不错的选...

weixin_33695450的博客 2200

面试题:Java线程的生命周期

一、在Thread的源码中有写出线程的六种状态: 1)NEW:新建状态 2)RUNNABLE:就绪状态 源码注释为:线程在JVM的状态为RUNNABLE就绪状态,但是需要等待操作系统资源。 解析:其实在操作系统内核创建线程的当前状态如果是Initialized,则调用sync -> wait(),如果线程状态被设置为RUNNABLE,则唤醒执行run()方法 3)BLOCKED:阻塞状态 在抢夺Synchronized锁失败之后会进入BLOCKED阻塞状态; 等待状态的线程在调用notify(

Small_Pang的博客 684

iphone查看/private/var/mobile/Containers/Data/Application/文件

xcode查看iPhone的private/var/文件夹xcode连接iPhone真机选择app下载Containers文件夹到mac电脑中查看手机中下载的文件 使用xcode真机调试的时候,文件目录都是这种/private/var/mobile/Containers/Data/Application/FAEFDF4D-5CE4-474F-9C53-C19789DB59F6/tmp/ xcode连接iPhone真机 不需要越狱,使用xcode上连接iPhone,然后选择运行的app,选择window-&g

小手琴师的博客 101万+

线程的生命周期,及之间的转换。

一、线程的生命周期 1、线程的5种状态:新建(New),就绪(Runnable),运行(Running),阻塞(Blocked),死亡(Dead) (1)新建状态(New):新创建了一个线程对象。 (2)就绪状态(Runnable):线程对象创建后,其它线程调用了该对象的start()方法。该状态的线程位于可执行线程池中,变得可执行,等待获取CPU的使用权。 (3)执行状态(Running):就绪状态的线程获取了CPU。执行程序代码。 (4)堵塞状态(Blocked):堵塞状态是线程由于某种原因放弃CPU使

qqazzx的博客 1248

Hyper-V显卡直通实战:手把手解决Windows 11虚拟机错误码43(附完整参数配置)

本文详细解析了在Windows 11 Hyper-V虚拟机中配置显卡直通时遭遇错误码43的根源,并提供了从环境检查、核心PowerShell命令(如Set-VMGpuPartitionAdapter)配置到虚拟机内驱动替换的完整实战解决方案,帮助用户彻底解决显卡驱动无法加载的问题。

weixin_29238147的博客 898

量化回测框架三选一:Backtrader、Zipline、PyAlgoTrade,新手到底该跟谁学?

本文对比分析了三大量化回测框架Backtrader、Zipline和PyAlgoTrade,帮助新手选择最适合的入门工具。从安装配置、策略编写到文档查阅,详细解析各框架的特点和适用场景,为量化交易初学者提供实用指南。

weixin_28745309的博客 268

线程的状态及各状态之间的转换

1、线程的状态 Java线程在运行的生命周期中可能处于6种不同的状态,在给定的一个时刻,线程只能处于其中的一个状态,6种状态如下: 1)NEW:初始状态,线程被构建,但还没有调用start()方法 2)RUNNABLE:调用start()可进入运行状态,java线程将操作系统中的就绪和运行两种状态统称为“运行中” 3)BLOCKED:阻塞状态,线程阻塞于锁,线程可能调用了join()方法,此时停止...

Jiacl1012的博客 795

ubuntu20.04升级OpenSSH

业务需求,需要将服务器的OpenSSH版本从8.2升级到最新版本(9.9),由于apt能提供的最新版本就是8.2,所以需要采用源码安装的方式。

xiamu66的博客 1524

线程的状态有哪几种?它们之间是如何转换的?

线程的状态有哪几种?它们之间是如何转换的? 1、线程状态分类 线程一共有六种状态,分别为 New、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING、TERMINATED,同一时刻只有一种状态,通过线程的 getState 方法可以获取线程的状态。 2、状态详解 Thread的状态使用 java.lang.Thread.State 枚举表示。 2.1、状态1:NEW 当线程被创建出来还没有调用 start() 状态时。 public class NewState { pu.

weixin_50216347的博客 2365

数据分析项目:直播电商用户流失分析

其中,'Tenure'(在网时长)可能是影响用户流失的关键因素,意味着用户在平台上的停留时间越长,流失的可能性可能越低,这提示平台应注重提高用户粘性,增加用户在平台上的活跃度和停留时间。)的分析,挖掘用户流失的原因和模式,分析发现用户投诉处理效率(Complain)、距上次消费时长(DaySinceLastOrder)、会员生命周期(Tenure)等8项核心指标对流失预测贡献度达87%,模型准确率94.58%,并提出相应的建议。重视用户的满意度,及时处理用户的投诉和反馈,不断改进平台的服务和功能。

Nervousr的博客 2459

2026年复旦微电数字IC笔试试卷带答案解析

摘要: 本文为复旦微电子MCU/SOC岗位笔试模拟题,涵盖单片机架构、数字电路、存储技术等核心知识点。内容包括: 单选题(30分):考察Cortex-M中断机制、时序分析(建立/保持时间)、逻辑化简、跨时钟域设计(格雷码应用)、存储器特性(NAND Flash操作单元)等; 波形分析(15分):聚焦D触发器行为、时钟分频、建立时间违例判断及跨时钟域同步; 多选题(25分):涉及亚稳态成因与处理、异步FIFO设计要点、MCU低功耗策略、NAND Flash特性及复旦微电市场地位; 简答题(20分):解析建立/

Open 344

线程的六种状态及其转换

线程的六种状态介绍 线程的几种状态可以在 Thread 类的源码中看到,它位于名叫 State 的枚举中。 如下所示,一共有六种。 1. 新建(New):线程创建后尚未启动的状态(即创建后还未调用 start() 方法)。 2. 可运行(Runnable):可能正在运行,也可能正在等待 CPU 时间片,包含了操作系统线程状态中的 Running 和 Ready。 3. 阻塞(Blocked)...

To be a great coder 696

1️⃣ Coze智能体基础入门教学(2025年全新版本)

不妨设想一下,倘若我们能够打造出一个数字助手,它不但能精准洞悉我们的需求,更可以独立思索、学习以及付诸行动,这便是 AI Agent 的基础理念。它恰似计算机世界里的 “智慧精灵”,能够感知周遭环境、做出判断并采取行动。AI Agent 的发展之路精彩纷呈。它走过了三个重要阶段:起初,它犹如一个被规则束缚的机器人,只能按预设好的指令开展工作。接着,它学会运用统计学方法,通过分析数据来做决策,变得越发灵活。到如今,凭借深度学习技术,它已经能够像人类一样去学习复杂的任务了。

李同学Lino的博客 4085

线程的生命周期及其六种状态的转换

线程的六种状态 线程的生命周期主要有以下六种状态: New(新创建) Runnable(可运行) Blocked(被阻塞) Waiting(等待) Timed Waiting(计时等待) Terminated(被终止) 在我们程序编码中如果想要确定线程当前的状态,可以通过getState()方法来获取,同时我们需要注意任何线程在任何时刻都只能是处于一种状态。 需要更多Java知识点和面试题的朋友可以点一点下方链接免费领取 链接:1103806531暗号:优快云 New 新建状态 首先我们展示一下整

weixin_48655626的博客 4557

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Java 线程的六种状态及其简易转换

NEW:初始状态,线程被创建,但是还没有调用start()方法。 > RUNNABLE:运行状态,Java线程将操作系统中的就绪和运行两种状态笼统地称作“运行中”。 BLOCKED:阻塞状态,表示线程阻塞于锁。 WAITING:等待状态,表示线程进入等待状态,进入该状态表示当前线程需要等待其他线程做出一些特定动作(通知或中断) TIMED_WAITING:超时等待状态,该状态不同于 WAITING,它是可以在指定的时间自行返回的。 TERMINATED:终止状态,表示当前线程已经执行完毕。

qq_53130059的博客 764

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

[Java并发编程]-线程的六种状态及其状态转换

1.线程自身信息线程运行的过程会产生很多信息,这些信息都保存在Thread类中的成员变量里面,常见的有: a.线程的ID是唯一标识getId() b.线程的名称:getName(),如果不设置线程名称默认为“Thread-xx” c.线程的优先级:getPriority,线程优先级从1-10,其中数字越大表示优先级别越高,同时获得JVM调度执行的可能性越大,JDK内置了三种常见的状态://最小

UniKylin 7657

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

线程六种状态的转换

线程生命周期包含六种状态:New(新建)、Runnable(可运行)、Blocked(阻塞)、Waiting(等待)、Timed Waiting(计时等待)和Terminated(终止)。新建线程处于New状态,调用start()后进入Runnable状态。Runnable状态可能正在执行或等待CPU调度。当线程获取锁失败时进入Blocked状态;调用wait()或join()会进入Waiting状态;带超时参数的等待方法会进入Timed Waiting状态。线程终止可能因正常执行完成或异常中断。状态转换是

qq_40589140的博客 845

java 线程的创建方式与线程的六种状态切换

线程是 CPU 调度的基本单位。 1. 线程的构造与创建方式 1.1 线程的构造 1.1.1 先了解 Thread 的构造 从构造函数开始,总共有九个 public class Thread implements Runnable { /* param1: runnable 任务,param2: 线程访问控制上下文,调用六个参数的 init(),此构造没有对外开放 */ Thread(Runnable target, AccessControlContext acc) { .

weixin_44245828的博客 191

线程P3 | 线程的状态及状态间的转换(jconsole + 代码讲解版)

可能有很多小伙伴是第一次接触到jconsole这个东西,都有点疑惑,这是个啥玩意儿?所以在正式讲解状态之前,我们先来了解一下啥是jconsole~~~其实通俗一点来讲,所谓的jconsole,就是java给我们提供的一个查看线程状态的工具,如果你没有移动java的安装位置,那么应该差不多和我在同一个位置,如果移动了位置,就找到你安装java的位置,打开你jdk的文件夹,后面的路径和我的相同~~我们来演示一下怎么使用这个工具,这里我写了一个死循环的线程代码try {});t.start();

各种关于Java的内容~~ 825

JAVA线程六种状态_Java:线程的六种状态及转化

多线程概述及创建方式Java:线程的六种状态及转化关于线程的生命周期,网上书上说法不一,难以统一,本篇做一个总结:java.lang.Thread.State枚举类中定义了六种线程的状态,可以调用线程Thread中的getState()方法获取当前线程的状态。线程状态解释NEW尚未启动的线程状态,即线程创建,还未调用start方法RUNNABLE就绪状态(调用start,等待调度)+正在运行BLO...

weixin_39532019的博客 202

java线程主要状态及转换论文_Java:线程的六种状态及转化

搜索热词多线程概述及创建方式Java:线程的六种状态及转化关于线程的生命周期,网上书上说法不一,难以统一,本篇做一个总结:java.lang.Thread.State枚举类中定义了六种线程的状态,可以调用线程Thread中的getState()方法获取当前线程的状态。线程状态解释NEW@H_301_73@尚未启动的线程状态,即线程创建,还未调用start方法@H_301_73@RUNNABLE@H...

weixin_31244053的博客 134

观察线程状态

线程状态: 线程状态。线程可以处于以下状态之一: NEW 尚未启动的线程处于此状态。 RUNNABLE 在Java虚拟机中执行的线程处于此状态。 BLOCKED 被阻塞等待监视器锁定的线程处于此状态。 WAITING 正在等待另一个线程执行特定动作的线程处于此状态。 TIMED_WAITING 正在等待另一个线程执行动作达到指定等待时间的线程处于此状态。 TERMINATED 已退出的线程处于此状态。 一个线程可以在给定时间点处于一个状态。 这些状态是不反映任何操作系统线程状态的虚拟机状态。

AOOOOO李 245

Java多线程(二):线程的生命周期与状态转换

状态触发条件变化条件NEW线程对象创建调用start()RUNNABLE正在运行或就绪——BLOCKED等待进入 synchronized 块获取到锁WAITINGwait()join()park()notify()sleep()超时或中断TERMINATED线程执行结束不可恢复理解线程的生命周期,是排查死锁、活锁、性能瓶颈等问题的基础。在后续文章中,我们将深入探讨线程同步机制(如)和线程间通信,这些机制正是通过控制线程状态转换来实现的。

2302_79277377的博客 1114

Java线程基础 - (二)线程的状态详解(对比三种、五种和六种状态)

介绍Java8中Thread(线程)定义的6种状态,并和传统线程模型的三种/五种状态进行对比

reading-conference-writing 2887

java线程状态详解与转换

System.out.println("线程状态: " + thread.getState());System.out.println("线程状态: " + thread.getState());System.out.println("线程状态: " + thread.getState());System.out.println("线程状态: " + thread.getState());当线程尝试进入一个被其他线程占用的同步代码块或方法时,线程会进入。:线程无限期等待其他线程的唤醒。

zhglhy的专栏 971
上一篇: ps 命令查看进程下的线程及线程状态
下一篇: KafKa数据存储与数据一致性保证
王树民
博客等级 码龄10年 912粉丝 560原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值