线程的生命周期通常有五种状态。这五种状态分别是:新建状态、就绪状态、运行状态、阻塞状态和死亡状态。 新建状态:指的是线程已经被创建,但是还不允许分配 CPU 执行。 就绪状态: 指的是线程可以分配 CPU 执行。在这种状态下,真正的操作系统线程已经被成功创建了,所以可以分配 CPU 执行。 运行状态:当有空闲的 CPU 时,操作系统会将其分配给一个处于可运行状态的线程,被分配到 CPU 的线程的状态就转换成了运行状态。 阻塞状态:运行状态的线程如果调用一个阻塞的 API(例如以阻塞方式读文件)或者等待某个事件(例如键盘输出Scanner方法调用),那么线程的状态就会转换到阻塞状态,同时释放 CPU 使用权,阻塞状态的线程永远没有机会获得 CPU 使用权。当等待的事件出现了,阻塞状态结束,线程就会从阻塞状态转换到就绪状态,重新抢到CPU时间片! 死亡状态:线程执行完或者出现异常就会进入死亡状态,死亡状态的线程不会切换到其他任何状态,进入死亡状态也就意味着线程的生命周期结束了。通常线程死亡的方式有三种:
run()方法执行完成,线程正常结束。
线程抛出一个未捕获的Exception或Error。
直接调用该线程的stop()方法来结束该线程——该方法容易导致死锁,通常不推荐使用。
二、线程的方法
1、sleep(long millis)线程休眠
线程休眠:让执行的线程暂停一段时间,进入等待状态。
static void sleep(long millis):调用此方法后,当前线程放弃 CPU 资源,在指定的时间内,sleep 所在的线程不会获得可运行的机会,此状态下的线程不会释放同步锁。
该方法更多的是用来模拟网络延迟,让多线程并发访问同一资源时的错误效果更加明显。
2.wait()线程等待