Java Thread--状态转换

      一个线程创建之后,总是处于其生命周期的4个状态之一中。线程的状态表明此线 程当前正在进行的活动,而线程的状态是可以通过程序来进行控制的,就是说,可以对线程 进行操作来改变状态。这些操作包括启动(start)、终止(stop)、睡眠(sleep)、挂起 (suspend)、恢复(resume)、等待(wait)和通知(notify)。每一个操作都对应了一个方法,这些 方法是由软件包java.lang提供的。
     ①创建(new)状态
     如果创建了一个线程而没有启动它,那么,此线程就处于创建状态。比如,下述语句执行 以后,使系统有了一个处于创建状态的线程myThread:
         Thread myThread= new MyThreadClass();
其中,MyThreadClass()是Thread的子类,而Thread是由Java系统的java.lang软件包提 供的。
     处于创建状态的线程还没有获得应有的资源,所以,这是一个空的线程。线程只有通过 启动后,系统才会为它分配资源。对处于创建状态的线程可以进行两种操作:一是启动 (start)操作,使其进入可运行状态,二是终止(stop)操作,使其进入消亡状态。如果进入到消 亡状态,那么,此后这个线程就不能进入其他状态,也就是说,它不再存在了。
     start方法是对应启动操作的方法,其具体功能是为线程分配必要的系统资源;将线程 设置为可运行状态,从而可以使系统调度这个线程。
     ②可运行(runnable)状态
     如果对一个处于创建状态的线程进行启动操作,则此线程便进入可运行状态。仍以前面 创建的myThread线程为例,用下列语句: myThread.start(); 则线程myThread进入可运行状态。上述语句实质上是调用了线程体即run()方法。注意, run()方法包含在myThread线程中,也就是先由java.lang包的Thread类将run()方法 传递给子类MyThreadClass(),再通过创建线程由于类MyThreadClass()传递给线程 myThread。
     线程处于可运行状态只说明它具备了运行条件,但可运行状态并不一定是运行状态。因 为在单处理器系统中运行多线程程序,实际上在一个时间点只有一个线程在运行,而系统中 往往有多个线程同时处于可运行状态。系统通过快速切换和调度使所有可运行线程共享处 理器,造成宏观上的多线程并发运行。
     可见,一个线程是否处于运行状态,除了必须处于可运行状态外,还取决于系统的调度。
     在可运行状态可以进行多种操作,最通常的是从run()方法正常退出而使线程结束,进 入消亡状态。此外,还可以有如下操作:
     挂起操作,通过调用suspend方法来实现;
     睡眠操作,通过调用sleep方法来实现;
     等待操作,通过调用wait方法来实现;
     退让操作,通过调用yield方法来实现;
     终止操作,通过调用stop方法来实现。
     前面三种操作都会使一个处于可运行状态的线程进入不可运行状态。比如,仍以 myThread线程为例,当其处于可运行状态后,再用如下语句:
         myThreadsleep(5000);
则调用sleep方法使myThread线程睡眠5秒(5000毫秒)。这5秒内,此线程不能被系统调 度运行,只有过5秒后,myThread线程才会醒来并自动回到可运行状态。
     如果一个线程被执行挂起操作而转到不可运行状态,则必须通过调用恢复(resume)操 作,才能使这个线程再回到可运行状态。
     退让操作是使某个线程把CPU控制权提前转交给同级优先权的其他线程。
     对可运行状态的线程也可以通过调用stop方法使其进入消亡状态。
     ③不可运行(not runnable)状态
     不可运行状态都是由可运行状态转变来的。一个处于可运行状态的线程,如果遇到挂起 (suspend)操作、睡眠(sleep)操作或者等待(wait)操作,就会进入不可运行状态。另外,如果 一个线程是和I/O操作有关的,那么,在执行I/O指令时,由于外设速度远远低于处理器速 度而使线程受到阻塞,从而进入不可运行状态,只有外设完成输入/输出之后,该线程才会自 动回到可运行状态。线程进入不可运行状态后,还可以再回到可运行状态。通常有三种途径 使其恢复到可运行状态。
     一是自动恢复。
     通过睡眠(sleep)操作而进入不可运行状态的线程会在过了指定睡眠时间以后自动恢 复到可运行状态;由于I/O阻塞而进入不可运行状态的线程在外设完成I/O操作后,自动 恢复到可运行状态。
     二是用恢复(resume)方法使其恢复。
     如果一个线程由于挂起(suspend)操作而从可运行状态进入不可运行状态,那么,必须 用恢复(resume)操作使其再恢复到可运行状态。
     三是用通知(notify或notiyA11)方法使其恢复。
     如果一个处于可运行状态的线程由于等待(wait)操作面转入不可运行状态,那么,必须 通过调用notify方法或notifyAll方法才能使其恢复到可运行状态。采用等待操作往往是由 于线程需要等待某个条件变量,当获得此条件变量后,便可由notify或notifyAll方法使线 程恢复到可运行状态。
     恢复到可运行状态的每一种途径都是有针对性的,不能交叉。比如,对由于阻塞而进入 不可运行状态的线程采用恢复操作将是无效的。
     在不可运行状态,也可由终止(stop)操作使其进入消亡状态。
     ④消亡(dead)状态
     一个线程可以由其他任何一个状态通过终止(stop)操作而进入消亡状态。线程一旦进 入消亡状态,那它就不再存在,所以也不可能再转到其他状态。
     通常,在一个应用程序运行时,如果通过其他外部命令终止当前应用程序,那么就会调 用stop方法终止线程。但是,最正常、最常见的途径是由于线程在可运行状态正常完成自身 的任务而“寿终正寝”,从而进入消亡状态,这个完成任务的动作是由run方法实现的。

 

 转载自:http://hi.baidu.com/jsoftware/blog/item/4a909424335160044d088d0b.html   

随机优化 (Stochastic Optimization) 算法详解及案例分析 随机优化是一种用于处理包含随机变量的优化问题的方法。其目标是通过考虑随机变量的概率分布,找到一个在期望意义下最优的解。 阅读详情

相关推荐

三分钟解决RKNN-Toolkit2安装失败:从模块报错到成功验证的完整记录

本文详细记录了RKNN-Toolkit2安装失败的解决方案,从环境配置到模型转换实战,特别针对常见的'No module named 'rknn''报错提供了完整修复指南。通过YOLOv8模型转换示例,展示了从ONNX到RKNN格式的完整流程,并分享了在RK3588芯片上的部署优化技巧。

html8的博客 264

Java 17 Thread.sleep 与 Object.wait 实战:5个关键区别与3种线程状态转换

本文深入解析Java 17中Thread.sleep与Object.wait的5大核心差异与3种线程状态转换机制。通过实战代码演示两者在锁行为、线程状态(如RUNNABLE、WAITING、TIMED_WAITING)和唤醒机制上的本质区别,帮助开发者避免常见并发陷阱,并优化生产者-消费者等经典模式的实现。

anwenzhao0749的博客 494

xilinx vivado 设置多核多线程加快综合、布局布线、仿真速度的方法

加快vivado布局布线速度的多核编译方法 在tcl中执行下面的语句 set param general.maxThreads n来设置,n是你的CPU线程数。 在设置之后你可以通过get_param general.maxThreads 指令来确认是否成功设置, 加快vivado综合速度的多核编译方法 操作方法与上面加快布局布线的方法一样。 实际发现效果并不是很明显,官方论坛中提到只有在LINUX上才能发挥8核以上的效能,而且8核以上的效能提升并不明显。 加快vivado仿真.

shawn的FPGA圈 2万+

Java 线程的几种状态

在 Java 中,线程是一种轻量级的执行单元,能够并发地执行多个任务。Java 线程具有多个状态,在不同状态间切换,接下来我们即将介绍这些状态.

qq_45726327的博客 704

Python 实现 傅里叶级数 对 函数拟合 并绘图

好记性不如烂笔头 目录傅里叶级数变换原理代码实现效果图 傅里叶级数变换原理 原理:待续… 傅里叶级数变换公式: 代码实现 本次实现的是符号函数的拟合: 注:若要实现其他函数的拟合,修改程序中 fx 的表达式即可 """ 傅里叶级数""" import sympy as sym import numpy as np import matplotlib.pyplot as plt N = 8 # 拟合的阶数 L = sym.pi # 周期的一半 n, x = sym.symbols('n x')

qq_41676952的博客 1万+

利用eds editor生成CANOPEN 设备eds文件

通过以上步骤,您可以根据实际设备的功能特性,自动生成一份符合CANopen协议标准的电子数据表(EDS文件),该文件可以被上位机软件或其他CANopen主站设备用于识别、配置和控制您的CANopen从站设备。使用CANopen EDS Editor生成CANOPEN设备的EDS文件是一个系统化的过程,它涉及将设备的具体技术参数和功能映射到CANopen规范定义的对象字典中。

weixin_38604759的博客 6458

线程的4个状态之间是如何进行转换的

答:一个线程创建之后,总是处于其生命周期的4个状态之一中。线程的状态表明此线 程当前正在进行的活动,而线程的状态是可以通过程序来进行控制的,就是说,可以对线程 进行操作来改变状态。这些操作包括启动(start)、终止(stop)、睡眠(sleep)、挂起 (suspend)、恢复(resume)、等待(wait)和通知(notify)。每一个操作都对应了一个方法,这些 方法是由软件包java.la...

panxq0809的专栏 250

swl安装无法与服务器建立链接,如何解决?

🏆本文收录于《全栈Bug调优(实战版)》专栏,主要记录项目实战过程中所遇到的Bug或因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!! 备注:部分问题/疑难杂症搜集于互联网。

**My Coding Family** 2075

并发操作之——JAVA线程常见几种状态以及相互之间的转化关系

并发操作 并发操作之——JAVA线程常见几种状态及解释 并发操作之——JAVA线程常见几种状态及解释并发操作前言一、JAVA线程有几种常见状态,分别是什么意思?创建(NEW):就绪(Runnable):运行(Running)阻塞(Blocked)等待阻塞:同步阻塞:等待(WAITING):超时等待(TIMED_WAITING):死亡(TERMINATED): 前言 并发操作之——JAVA线程常见几种状态及解释。 一、JAVA线程有几种常见状态,分别是什么意思? JDK的线程状态分6种,JVM里面9种

weixin_42397937的博客 6760

关于Sybase ASE数据库的license以及试用版过期的问题的解决方案

当用户从Sybase官网上下载了ASE15.0.2以后,如果选择了安装Express Edition或者Developer Edition,基本上不会碰到什么问题,除了有些功能受限以下。 但大多数可能选择了Enterprise Edition for Evaluation类型,即企业版试用。都会碰到这样的问题,即一个月以后,license过期,无法启动server。于是很郁闷,可能大部分人,会选...

iihero@优快云 790

【云原生】阿里云SLS日志自定义字段标签实现日志告警

样例:一个典型的java log初始化日志格式把日志中的INFO提取出来做为一个标签,在开源日志框架中,配置采集器实现- regex:在阿里云SLS日志服务同样可以实现,首先我们进入到一个日志库,查看数据接入,我这里使用的是Logtail工具在【处理配置】中,选择【处理插件组合】,新增提取字段插件原始字段:填写要被提取的日志,对应原始字段的内容做正则结果字段:正则表达式对应的捕获组对应结果:捕获组 匹配内容 说明1 ywgy-app-service 服务名称。

CN_Eden 742

java线程四种状态_基于java 线程的几种状态(详解)

线程可以有六种状态:1.New(新创建)2.Runnable(可运行)(运行)3.Blocked(被阻塞)4.Waiting(等待)5.Timed waiting(计时等待)6.Terminated(被终止)新创建线程:当用new操作符创建一个新线程时,如new Thread(r),该线程还没有开始运行,它的当前状态为new,在线程运行之前还有一些基础工作要做。可运行线程:一旦线程调用start方...

weixin_35899324的博客 386

lammps 案例in文件汇总

进阶案例: 聚乙烯和石墨烯界面pull out模拟代码 反应力场reax/c设置方法及案例解析 石墨烯热导率模拟代码(NEMD方法) 圆锥形SiC纳米磨削单晶硅源代码 高熵合金FeNiCrCoCu纳米压痕模拟代码 fix indent命令实现纳米摩擦及摩擦力计算 Fe原子辐照轰击多层石墨烯模拟代码 铝基石墨烯复合物压缩变形in文件源代码 石墨烯自动卷曲到Fe纳米线模拟源代码 铝/石墨烯复合物结晶过程lammps模

lammps_jiayou的博客 9445

java thread 状态转换

new(新建):表示线程被创建但尚未启动的状态,刚创建的线程还没有执行start方法。 runnable(运行状态):对应操作系统有ready和running两个状态 ready(准备就绪):等待cpu资源 running(运行中):获取到cpu资源 blocked(阻塞):等待IO完成或者锁释放 timed waiting(计时等待): 设置了时间参数的 Thread.sleep(long millis) 方法; 设置了时间参数的 Object.w...

book 405

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Java Thread 状态转换

一、线程状态转换图 状态图转换如下: 状态说明 New:创建状态,线程创建后未启动时的状态。 Running:运行状态,线程启动并获得cpu时间片(在运行状态之前还有一个就绪状态,是指其它运行资源都就绪,只要获得cpu时间片后即可运行的状态)。 Waiting:无限期等待状态,处于此状态的线程不会被分配cpu时间片,需要等待被其它线程唤醒。 Timed Waiting:限期等待状态,处于此状态的线

tterminator的专栏 1179

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

java Thread 状态转换图

[img]http://dl.iteye.com/upload/attachment/236790/d2283fc2-0eb0-345a-9338-050a86dbbdb0.jpg[/img]

pacozhong的专栏 170

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

面经手册 · 第20篇《Thread 线程,状态转换、方法使用、原理分析》

作者:小傅哥 博客:https://bugstack.cn Github:https://github.com/fuzhengwei/CodeGuide/wiki 沉淀、分享、成长,让自己和他人都能有所收获!???? 一、前言 考不常用的、考你不会的、考你忽略的,才是考试! 大部分考试考的,基本都是不怎么用的。例外的咱们不说???? 就像你做程序开发,尤其在RPC+MQ+分库分表,其实很难出现让你用一个机器实例编写多线程压榨CPU性能。很多时候是扔出一个MQ,异步消费了。如果没有资源竞争,例如库表秒杀,

bugstack虫洞栈 1884

Java中线程状态转换-Thread state in java

前言:本文解决的问题 java中的线程有哪些状态 这些状态怎么转换 1 Java中线程的状态 在任何时候JAVA中的线程总处于以下Thread.State枚举类6种状态中的一种: New,任何线程被新建后就处于该状态 Runnable , 当调用start()方法后线程的状态 Waiting,等待另一个线程执行动作,比如当前线程调用join(),另一线程的状态 Timed-waiting,正...

weixin_34357928的博客 408

Java线程Thread的状态解析以及状态转换分析 多线程中篇(七)

Java线程Thread的状态解析以及状态转换分析 多线程中篇(七) 线程与操作系统中线程(进程)的概念同根同源,尽管千差万别。 操作系统中有状态以及状态的切换,Java线程中照样也有。 State 在Thread类中有内部类 枚举State,用于抽象描述Java线程的状态,共有6种不同的状态 详细定义如下: pub...

noteless的博客 374

java线程状态转换_Java线程Thread的状态解析以及状态转换分析 多线程中篇(七)...

线程与操作系统中线程(进程)的概念同根同源,尽管千差万别。操作系统中有状态以及状态的切换,Java线程中照样也有。State在Thread类中有内部类 枚举State,用于抽象描述Java线程的状态,共有6种不同的状态详细定义如下:public enum State {/*** 至今尚未启动的线程的状态。*/NEW,/*** 可运行线程的线程状态。* 处于可运行状态的某一线程正在 Java 虚拟机...

weixin_35922953的博客 130

[Thread,Thread State]线程,线程状态

线程 线程 & 进程 学过操作系统的基本都知道这个词。一开始出现的是进程,进程是操作系统中分时系统的一个基本运作单位。但是后来由于系统设计的升级,对进程又进行了划分,所以出现了线程。 进程可以包含多个线程,至少一个。这样就出现了线程来执行用户需要执行的命令。区别总结一下: 进程是一段正在执行的程序,是资源分配的基本单元,而线程时CPU调度的基本单元。 进程间相互独立,进程与进程之间不能共享资源,一个进程至少有一个线程,同一个进程的各线程共享整个进程的资源(寄存器,堆栈,上下文)。 线程的创建和

Cui's Blog 808

Java Thread 中 run() 与 start() 的区别

Java Thread 中 run() 与 start() 的区别 Java 的线程是通过 java.lang.Thread 类来实现的。VM 启动时会有一个由主方法所定义的线程。可以通过创建 Thread 的实例来创建新的线程。每个线程都是通过某个特定 Thread 对象所对应的方法 run() 来完成其操作的,方法 run() 称为线程体。通过调用 Thread 类的 start() 方法来启动一个线程。 在 Java 当中,线程通常都有五种状态,创建、就绪、运行、阻塞和死亡。 第一是创建状态。在

xsxy0506的博客 1319

Java Thread 总结

这篇文章的主要内容来自于网络,由我来整理,姑且算是原创吧,但是对于内容的提供者,在此表示感谢。 1.线程概述 线程是一个程序的多个执行路径,执行调度的单元,依托于进程的存在。线不仅可以共享进程的内在,而且还拥有一个属于自己的内存空间,这段内存空间就是线程栈,是在建立线程时系统分配的,主要用来保存线内部所使用的数据,如线程执行函数中所定义的变量,线程的状态等信息。 Java中的多线程是一个抢占

Liyunlong 480

线程状态转换?创建线程的几种方式?线程如何停止?

相比于 wait() 这种等待方式,await() 可以指定等待的条件,因此更加灵活。输出:我们期望的是:线程执行了步骤 1 之后,收到中断线程的指令,然后就不要再执行步骤 2 了,但从上述执行结果可以看出,使用自定义中断标识符是没办法实现我们预期的结果的,这就是自定义中断标识符,响应不够及时的问题。对于以下代码,虽然 b 线程先启动,但是因为在 b 线程中调用了 a 线程的 join() 方法,b 线程会等待 a 线程结束才继续执行,因此最后能够保证 a 线程的输出先于 b 线程的输出。

weixin_62421895的博客 689
上一篇: Java Annotation详解(转载)
下一篇: Java System 类
cwfmaker
博客等级 码龄18年 6粉丝 179原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值