线程的生命周期

线程的生命周期中有5个状态:创建、就绪、运行、阻塞、死亡。其中从就绪到运行,这两个状态的切换存在不确定因素,需要等待cpu的调度,获取cpu的时间片。

1:新建和就绪状态
    当程序使用new关键字创建了一个线程之后,该程序处于创建状态。
    当线程调用start()方法之后,该线程处于就绪状态。

注意:启动线程的方法是start()并不是run()方法。永远不要让线程对象直接调用run()方法。

2:运行和阻塞
    运行和阻塞这两个状态是线程中最“复杂”的状态,不过,运行只能单向的到阻塞,而阻塞并不能直接到运行状态。

从运行到阻塞的情况:
    (1)线程调用sleep()方法
    (2)线程调用了一个阻塞IO方法,在方法返回前,线程被阻塞。
    (3)线程获取一个同步监视器,可是该监视器正在被其他线程使用。
    (4)线程等待某个通知(notify)
    (5)线程调用了suspend()方法,将该线程挂起。(不建议使用,会造成死锁)

阻塞状态只能重新到达就绪状态:    
    (1)调用sleep()方法的线程经过了指定时间。
    (2)调用的阻塞IO方法已经返回。
    (3)线程已经获取到了同步监视器。
    (4)线程等到了其它线程的通知。
    (5)线程调用resume()方法将挂起的线程恢复。

线程切换图:    
3:线程死亡

线程从运行到死亡的方式:
    (1)调用线程的stop()方法。(不建议使用,容易造成死锁)
    (2)线程抛出一个未捕获的Exception或Error
    (3)线程执行体run()或call()方法执行结束。

注意: 线程中有一个很常见的异常:IllegalStateException(非法状态异常)。用通俗的语言表达就是,在线程相应的状态干了不相应的事。   
比如说:
    同一个线程调用了两次start()方法。线程调用第一次start()方法就已经处于就绪状态了,再次以就绪状态调用start()方法让自身处于就绪状态,请问这是闹哪样?
再比如说:
    已经死亡的线程,调用start()方法。都“死亡”了,线程自己就没点“逼数”吗?

posted @ 2020-05-28 15:14  林就远  阅读(475)  评论(0编辑  收藏  举报