黑马程序员技术交流社区
标题:
关于线程状态的问题
[打印本页]
作者:
hdsjsql
时间:
2013-4-19 09:23
标题:
关于线程状态的问题
本帖最后由 hdsjsql 于 2013-4-20 14:54 编辑
线程在被创建和运行两个状态间是否还存在临时阻塞状态。
线程状态.png
(94.82 KB, 下载次数: 8)
下载附件
2013-4-19 09:21 上传
作者:
HM王琦
时间:
2013-4-19 09:55
一个线程有4种状态,任何一个线程肯定处于这4中状态中的一种。
1,初始状态:当线程对象被建立之后,并在调用start()方法之前。此时线程处于初始状态。
这时线程对象已经产生,但是没被启动。此时可调用start()启动线程和stop()方法停止线程。
2,可执行状态:当线程对象调用start方法后,线程就转入可执行状态。当有多个线程处于可执行状态时,
这些线程都一个线程池中,排程器会按照先后顺序排列它们,当有CPU资源时,排程器会依次启动这些线程。
所以,处于可执行状态的线程可能在它正在执行,也可能在线程池中等待。
3,阻塞状态:如线程对象调用wait()方法后,线程就处于阻塞状态。
此时排程器会忽略它,不对它进行排程。由阻塞状态可以通过resume()方法恢复多可执行状态,它有可能重新执行。
4,退出状态:当一个线程正常结束或调用stop()方法。这个线程就退出了
作者:
先小涛
时间:
2013-4-19 15:01
本帖最后由 先小涛 于 2013-4-19 15:03 编辑
java中,每个线程都需经历新生、就绪、运行、冻结和死亡五种状态,线程从新生到死亡的状态变化称为生命周期。用new运算符和Thread类或其子类建立一个线程对象后,该线程就处于新生状态。
新生(被创建)--->就绪:通过调用start()方法
就绪(临时状态,说就绪更准确点)--->运行:处于就绪状态的线程一旦得到CPU,就进入运行状态并自动调用自己的run()方法
运行--->冻结:处于运行状态的线程,执行sleep()方法,或等待I/O设备资源,让出CPU并暂时中止自己运行,进入阻塞状态
冻结--->就绪:睡眠时间已到,或等待的I/O设备空闲下来,线程便进入就绪状态,重新到就绪队列中等待CPU。当再次获得CPU时,便从原来中止位置开始继续运行。
运行--->死亡(1)(正常情况下)线程任务完成
(2)(非正常状况)线程被强制性的中止,如通过执行stop()或destroy()方法来终止一个线程
作者:
易杰
时间:
2013-4-19 15:04
线程的五种常见状态
1.线程被创建。--------调用线程类(Thread的子类)的构造函数,创建线程对象。
2.准备状态。----------调用线程对象的start()方法,开启线程。多个线程间相互争夺获取计算机资源。
3.运行状态。----------线程争夺获取了计算机资源后,线程对象的run()方法中的代码被执行,线程处于运行状态。
4.线程休息状态。----------调用线程对象的sleep(long millis)方法,使线程处于休息状态。(休息状态下的线程不会争夺获取计算机资源,所以线程对象的run()方法中的代码不会被执行)休息的时间为 mills毫秒。时间过后,线程会自动转换为准备状态。
-----------调用线程对象的wait()方法,也能使线程处于休息状态。但是线程不会自动转换为准备状态,要使用线程对象的notify()方法来转换。
5.线程被结束。----------调用对象的stop()方法结束线程,该方法已经过时,不建议使用。
----------当run()方法中的代码执行完后线程会自动结束。
作者:
黄玉昆
时间:
2013-4-20 14:48
如果问题未解决,请继续追问,如果问题解决了,请将问题分类改为“已解决”,谢谢
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2