java的线程的生命周期五种状态解释

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

java的线程的⽣命周期五种状态解释
线程的⽣命周期
1.线程的状态:
在《疯狂java》中介绍了线程有五种状态:新建(new),就绪(Runnable),运⾏(Running),阻塞(Blocked)和死亡(Dead)
但是我查看thread源码之后,发现线程的状态有六种:
public enum State {
NEW,
RUNNABLE,
BLOCKED,
WAITING,
TIMED_WAITING,
TERMINATED;
}
ps:注释太长了我没有下拉下来,各位感兴趣可以去看看
2.新建和就绪状态
当程序中new了⼀个thread对象的时候,这个线程处于就绪状态,和其他的对象相同,由jvm分配内存,并且初始化成员变量的数值,这个时候这个线程没有表现出来任何线程的动态特性,也没有执⾏线程体
当使⽤了start()⽅法之后,线程状态转变为就绪状态,但是还没有运⾏,等待cpu的分配,这个时候是否运⾏取决于jvm中线程调度器的调度对于⼀个thread对象,如果直接使⽤run()⽅法,并不算启动了线程,这个时候运⾏其实是把run()当做普通的⽅法去执⾏
下⾯的这个例⼦中,currentThread().getName()返回的是main线程的名字
public static class CurThread extends Thread
{
public int i=0;
public void run() {
for(int j=0;j<10;j++)
System.out.println("I: "+i+++Thread.currentThread().getName());
}
}
public static void main(String[]__)
{
CurThread t=new CurThread();
t.run();
//System.out.println(t.isAlive());
}
也就是说实际上,这个时候并不是thread-0去执⾏。

#⼩疑问
书上说对于⼀个线程调⽤run()会改变这个线程的状态,由于start()⽅法调⽤的时候,必须要求线程处于new状态,因此对于⼀个线程调⽤run(),在调⽤start()就会抛出IllegalThreadStateException异常。

但是我在我本地环境尝试的时候,照跑不误。

3.运⾏和阻塞状态
对于计算机只有⼀个CPU,那么在任何时候就只有⼀个线程处于运⾏状态,在有多个处理器的机器上,会有多个线程并⾏,当线程数⼤于处理器数的时候,依然会存在线程在同⼀个CPU上轮换的情况
抢占式系统调度
当程序使⽤⼀段时间之后,系统会剥夺该线程所占⽤的资源,让其他线程获得执⾏的机会,在在选择下⼀个线程的时候,系统会考虑线程的优先级。

对于线程的优先级
MAX_PRIORAITY
MIN_PRIORITYY1
NORM_PRIORITY5
协作式调度
只有当⼀个线程调⽤了他的sleep(),或者yield()⽅法后才会主动的放弃所占⽤的资源
线程之间阻塞和去除阻塞⽅法的对应关系:
sleep():主动放弃所占⽤的处理器资源
调⽤sleep()的线程已经过了指定的时间
线程调⽤了⼀个阻塞式的IO⽅法
线程调⽤的阻塞式IO⽅法已经返回
线程视图获得⼀个同步监视器
线程成功获得了视图取得的同步监视器
线程等待某个通知notify
得到了其他线程的通知
线程调⽤了线程的suspend()⽅法将该线程挂起,但是可能会造成死锁,所以应该尽量避免使⽤该⽅法
使⽤resume()⽅法回复
图⽰:
图中可以看出,线程总阻塞状态可以回到就绪,但是就绪状态和运⾏状态之间转换是收到处理器的调度,但是有⼀个⽅法yield()是可以做到控制的。

yield()⽅法通知当前线程取消对资源的占⽤,但是当前线程在yield之后还是有可能拿到资源,并且重新到达运⾏状态
4.死亡状态
run()⽅法或者call()⽅法执⾏完毕,线程正常结束
线程抛出⼀个未捕获的Exception⽅法
直接调⽤这个线程的stop()⽅法来结束该线程,不过会有可能造成死锁
ps:注意,当⼀个线程已经变为死亡状态,调⽤start()⽅法就会抛出异常,也就是说对于同⼀个线程不能同时调⽤两次start()⽅法。

相关文档
最新文档