线程的五大状态

线程从创建、运行到结束总是处于下面五个状态之一:新建状态、就绪状态、运行状态、阻塞状态及死亡状态。

1.新建状态(New): 
        当用new操作符创建一个线程时, 例如new Thread(r),线程还没有开始运行,此时线程处在新建状态。 当一个线程处于新生状态时,程序还没有开始运行线程中的代码

2.就绪状态(Runnable)

一个新创建的线程并不自动开始运行,要执行线程,必须调用线程的start()方法。当线程对象调用start()方法即启动了线程,start()方法创建线程运行的系统资源,并调度线程运行run()方法。当start()方法返回后,线程就处于就绪状态。

处于就绪状态的线程并不一定立即运行run()方法,线程还必须同其他线程竞争CPU时间,只有获得CPU时间才可以运行线程。因为在单CPU的计算机系统中,不可能同时运行多个线程,一个时刻仅有一个线程处于运行状态。因此此时可能有多个线程处于就绪状态。对多个处于就绪状态的线程是由Java运行时系统的线程调度程序(thread scheduler)来调度的。

3.运行状态(Running)

当线程获得CPU时间后,它才进入运行状态,真正开始执行run()方法.

4. 阻塞状态(Blocked)

线程运行过程中,可能由于各种原因进入阻塞状态:
        1>线程通过调用sleep方法进入睡眠状态;
        2>线程调用一个在I/O上被阻塞的操作,即该操作在输入输出操作完成之前不会返回到它的调用者;
        3>线程试图得到一个锁,而该锁正被其他线程持有;
        4>线程在等待某个触发条件;
        ......

所谓阻塞状态是正在运行的线程没有运行结束,暂时让出CPU,这时其他处于就绪状态的线程就可以获得CPU时间,进入运行状态。

5. 死亡状态(Dead)

有两个原因会导致线程死亡:
        1) run方法正常退出而自然死亡,
        2) 一个未捕获的异常终止了run方法而使线程猝死。
        为了确定线程在当前是否存活着(就是要么是可运行的,要么是被阻塞了),需要使用isAlive方法。如果是可运行或被阻塞,这个方法返回true; 如果线程仍旧是new状态且不是可运行的, 或者线程死亡了,则返回false.

时间: 2024-09-30 14:57:39

线程的五大状态的相关文章

JUC-12.1.1-线程池中七大参数 四种线程池 五大状态

 ---------------->七大参数 在java中 ThreadPoolExecutor 是线程池类,这也是我们通常所说的线程池      下图是ThreadPoolExecutor构造方法 最后一个是全参数构造   里面有七大参数  corePoolSize 核心线程数量    maximumPoolSize  最大线程数     默认策略是超出会抛出异常 keepAliveTime  线程空闲后存活时间    TimeUnit  时间单位  和keepAliveTime配合使用  

java线程五种状态

java线程五种状态: 创建 -> 就绪 -> 运行 -> 销毁 创建 -> 就绪 -> 运行 -> 等待(缺少资源) -> 销毁 下图:各种状态转换

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

转载请注明:http://blog.csdn.net/UniKylin/article/details/45050823 1.线程自身信息 线程运行的过程会产生很多信息,这些信息都保存在Thread类中的成员变量里面,常见的有: a.线程的ID是唯一标识getId() b.线程的名称:getName(),如果不设置线程名称默认为"Thread-xx" c.线程的优先级:getPriority,线程优先级从1-10,其中数字越大表示优先级别越高,同时获得JVM调度执行的可能性越大,JDK

线程的分离状态与结合状态

以下内容引用自:http://www.cnblogs.com/mydomain/archive/2011/08/14/2138454.html 在任何一个时间点上,线程是可结合的(joinable),或者是分离的(detached). 可结合的线程能够被其他线程收回其资源和杀死:在被其他线程回收之前,它的存储器资源(如栈)是不释放的. 分离的线程是不能被其他线程回收或者杀死的,它的存储器资源在它终止时由系统来释放. 在默认情况下,线程是非分离状态的.如果不需要了解线程的终止状态,就让线程以分离状

线程有哪些状态

线程有哪些状态

java线程四种状态

一个线程可以有四种状态: 1.新(new), 即线程刚刚创建,而并未执行 2.可运行(runnable),意味着一旦时间分片机制有空闲的CPU周期提供给一个线程,那个线程便可立即开始运行.因此,线程可能在.也可能不在运行当中,但一旦条件许可,没有什么能阻止它的运行——它既没有“死”掉,也未被“堵塞”. 3.Dead,从自己的run()方法中返回后,一个线程便已“死”掉.亦可调用 stop()令其死掉,但会产生一个违例——属于Error的一个子类(也就是说,我们通常不捕获它).记住一个违例的“掷”

线程的分离状态 detached joinable

转自  http://blog.chinaunix.net/uid-26983585-id-3315953.html 部分红色背景部分是自己添加. 其实在写上一篇日志的时候,由于我把创建线程的返回值的判断条件写错了,程序每次运行的时候都是显示创建线程失败,我就百度了一下,有人说是桟资源不足引起的,要调用一个pthread_attr_setdetachstate()函数,当时不明白为什么,其原理是什么,于是又搜了一下,下文是其原理简述: 在任何一个时间点上,线程是可结合的(joinable),或者

线程的分离状态

在任何一个时间点上,线程是可结合的(joinable),或者是分离的(detached).一个可结合的线程能够被其他线程收回其资源和杀死:在被其他线程回收之前,它的存储器资源(如栈)是不释放的.相反,一个分离的线程是不能被其他线程回收或杀死的,它的存储器资源在它终止时由系统自动释放. 线程的分离状态决定一个线程以什么样的方式来终止自己.在默认情况下线程是非分离状态的,这种情况下,原有的线程等待创建的线程结束.只有当pthread_join()函数返回时,创建的线程才算终止,才能释放自己占用的系统

JAVA线程间的状态转换

线程间的状态转换:  1. 新建(new):新创建了一个线程对象. 2. 可运行(runnable):线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法.该状态的线程位于可运行线程池中,等待被线程调度选中,获取cpu 的使用权 . 3. 运行(running):可运行状态(runnable)的线程获得了cpu 时间片(timeslice) ,执行程序代码. 4. 阻塞(block):阻塞状态是指线程因为某种原因放弃了cpu 使用权,也即让出了cpu timeslice,