想起前段时间做校招的时候经常会被问到线程的生命周期问题,现在结合api做一下归纳
1.新建状态
new Thread()
创建一个线程,现在的线程并没有具备运动能力的,可以想象你新建了一只兔子,但是这只兔子没有你的命令不能行动。
2.可运行状态
thread.start()
当调用该命令时,线程具备运动的能力,但不一定能运动(此时有别的线程在运行,或者有一个IO在阻塞),所以具备运动能力的兔子不一定能运动,现在的兔子是可运行状态。
3.运行状态
thread.run()//自动调用
这很容易理解,当兔子开始跑的时候呢,就是线程里面的run方法真的被运行的时候,就是线程的运行状态
thread.join()
调用该方法时会首先执行该线程,你想想你把一只兔子加入了一个比赛的行列的第一个位置,那这样是不是后面的兔子都得等这只兔子跑完才能跑呢。
4.阻塞状态
thread.sleep(1000);//此时的线程不释放锁,但是已经阻塞
thread.wait() //此时的唤醒需要用 thread.notify|thread.notifyAll 此时的线程释放锁
thread.suspend() //wait 的旧版本,唤醒需要用 thread.resume() 该方法会引发死锁问题
thread.yield() //“退让”,该线程让出当前CPU运行片,让别的线程可以使用,但是不保证该线程又会再一次抢占CPU
兔子想睡觉的时候别人不可以打扰,一定要等他睡完了才能继续跑。
如果你让兔子停的话,那么兔子就会听你的命令,他就不比赛了 把锁也给抛弃掉了,如果你想让他继续的话你必须通知他。
如果你劝一只兔子退让一下让别的兔子通过桥的话,他可以选择不听你的。
5.死亡状态
如果兔子比赛完了,那么他就死了。
如果兔子在跑的过程中身体出现了异常,那么他就死了。