线程的状态转换

线程的状态有:new、runnable、running、waiting、timed_waiting、blocked、dead 

当执行new Thread(Runnabler)后,新创建出来的线程处于new状态,这种线程不可能执行 

当执行thread.start()后,线程处于runnable状态,这种情况下只要得到CPU,就可以开始执行了。runnable状态的线程,会接受JVM的调度,进入running状态,但是具体何时会进入这个状态,是随机不可知的 

running状态中的线程最为复杂,可能会进入runnable、waiting、timed_waiting、blocked、dead状态: 
如果CPU调度给了别的线程,或者执行了Thread.yield()方法,则进入runnable状态,但是也有可能立刻又进入running状态 
如果执行了Thread.sleep(long),或者thread.join(long),或者在锁对象上调用object.wait(long)方法,则会进入timed_waiting状态 
如果执行了thread.join(),或者在锁对象上调用了object.wait()方法,则会进入waiting状态 
如果进入了同步方法或者同步代码块,没有获取锁对象的话,则会进入blocked状态 

处于waiting状态中的线程,如果是因为thread.join()方法进入等待的话,在目标thread执行完毕之后,会回到runnable状态;如果是因为object.wait()方法进入等待的话,在锁对象执行object.notify()或者object.notifyAll()之后会回到runnable状态 

处于timed_waiting状态中的线程,和waiting状态中的差不多,只不过是设定时间到了,就会回到runnable状态 

处于blocked状态中的线程,只有获取了锁之后,才会脱离阻塞状态 

当线程执行完毕,或者抛出了未捕获的异常之后,会进入dead状态,该线程结束

参考的资源:

http://go-on.iteye.com/blog/1673894

http://www.cnblogs.com/zhengyun_ustc/archive/2013/01/06/dumpanalysis.html

时间: 2024-10-25 10:40:36

线程的状态转换的相关文章

IOS多线程开发之线程的状态_IOS

大家都知道,在开发过程中应该尽可能减少用户等待时间,让程序尽可能快的完成运算.可是无论是哪种语言开发的程序最终往往转换成汇编语言进而解释成机器码来执行.但是机器码是按顺序执行的,一个复杂的多步操作只能一步步按顺序逐个执行.改变这种状况可以从两个角度出发:对于单核处理器,可以将多个步骤放到不同的线程,这样一来用户完成UI操作后其他后续任务在其他线程中,当CPU空闲时会继续执行,而此时对于用户而言可以继续进行其他操作:对于多核处理器,如果用户在UI线程中完成某个操作之后,其他后续操作在别的线程中继续

C#如何判断线程的状态

在软件开发中常常需要获得线程的状态,用线程对象的IsAlive属性可以判断线程的状态. 主要程序代码. System.Threading.Threadth=new System.Threading.Thread(Show); th.Start(); if(th.IsAlive) { }

总结Java中线程的状态及多线程的实现方式_java

线程的状态线程状态图: 说明: 线程共包括以下5种状态.1. 新建状态(New) : 线程对象被创建后,就进入了新建状态.例如,Thread thread = new Thread().2. 就绪状态(Runnable): 也被称为"可执行状态".线程对象被创建后,其它线程调用了该对象的start()方法,从而来启动该线程.例如,thread.start().处于就绪状态的线程,随时可能被CPU调度执行.3. 运行状态(Running) : 线程获取CPU权限进行执行.需要注意的是,线

Flink-CEP论文与源码解读之状态与状态转换

Flink CEP的论文与设计 Flink的CEP设计与实现重度参考了论文<Efficient Pattern Matching over Event Streams>.下面我们就来结合论文谈谈Flink CEP的设计. 这篇论文探讨的话题是如何在事件流上进行高效地模式匹配.谈及模式匹配,为大众所知的可能是正则表达式匹配,而在流上运用正则表达式进行模式匹配有两个挑战: 要求丰富的语言特性:在事件流上进行模式匹配的语言明显要比用正则表达式进行模式匹配的语言所需要的能力丰富得多.这些事件模式语言需

mfc-如何获线程的状态???

问题描述 如何获线程的状态??? MFC开发,如何获取子线程的状态,确保子线程只有在挂起的状态下才会被激活? 解决方案 不管是Windows API还是MFC的CWinThread类都没有给出直接获得线程状态的接口或函数.线程的状态分为正在执行.挂起.已经结束三种.利用API函数GetExitCodeThread()时获得的返回码只能判定线程是活着的还是已经结束了,这里"活着的"指的是正在执行或挂起状态.那么如果一个线程还活着,怎样鉴别一个线程是正在执行还是正在挂起呢???令人遗憾的是

MySQL实例阻塞分析一例(线程statistics状态)

本文用实例来分析MySQL阻塞-线程statistics状态. 一. 现象 某日下午下班后低峰期,现网MySQL一个库突然报出大量慢sql,状态是 statistics,但是过后拿这些sql去执行的时候,实际很快.处于 statistics 状态的线程有个特征:查询的都是视图,但看监控那个时间段并没有明显的update/detele/insert. 通过我们的快照程序,去分析当时的 innodb status,发现如下信息: SEMAPHORES ---------- OS WAIT ARRAY

java类的问题-一个订单拥有十几个状态,想问一下,如何进行状态转换并跳转不同页面,求大侠指点迷津

问题描述 一个订单拥有十几个状态,想问一下,如何进行状态转换并跳转不同页面,求大侠指点迷津 一个订单拥有十几个状态,想问一下,如何进行状态转换并跳转不同页面,求大侠指点迷津 解决方案 这个不算什么问题,你直接判断就可以了,只是这样的写法不容易维护,一个容易维护的做法就是编写一个状态机,根据状态返回下一步的页面.再进一步,可以用现成工作流引擎. 解决方案二: 后台写服务,不断判别状态来进行跳转

由软件测试bug状态转换想到的

由软件测试bug状态转换想到的 上周四,不得不对客户新启用的bug管理工具Redmine中的bug状态进行验证.当然Redmine其实是一个项目管理工具,bug管理只是它的一部分功能而已.我在验证之前,是让一个经验不多的同事去验证的,主要是因为Redmine是客户的testmanager自定义了,我们发现之前的配置下某些状态下不能修改bug的状态了,或者说bug可选的状态不对.所有有必要在客户又重新调整后验证一下,是否符合我们一般的要求.同事的工作经验不多,估计又是忙着下班,着急的看了就画了个流

C#如何获取一个指定进程的某个线程的状态

问题描述 在:1.已经能够获取到该进程的ID2.已经能够获取到该进程的指定线程的ID和句柄的条件下,怎么获取该线程的状态.状态就是System.Threading.ThreadState中的那10种中的任意一种,我想把它打印到一个listbox里.查了很多都是获取"当前"线程的状态,而不是"指定"线程的状态. 解决方案 解决方案二:Process[]arr=Process.GetProcessesByName("QQ");if(null!=arr