线程从创建到消亡,一直处于线程的五种状态之一,如图:
1.新建(New):
通过诸如new Thread(() ->{});这样的方式,创建一个新的线程后,线程处于新建状态下,等待被启动
2.就绪(Runnable):
以下情况中线程将会进入就绪状态:
- 当线程的start()方法被调用时,start()方法创建线程运行的系统级资源
- Blocked Pool中的阻塞线程阻塞超时,自动进入就绪状态
- 调用线程resume()方法,唤醒线程
- 调用线程notify()方法,唤醒线程
3.运行(Running):
当线程被start()方法启动,或从阻塞状态中唤醒后,并不会立即执行,只有当CPU为线程分配了时间片,才会进入运行状态,当时间片消耗完毕,如果线程的run()方法仍未执行完毕,线程会进入阻塞状态,如果run()方法执行完毕,线程死亡
4.阻塞(Blocked):
阻塞状态的线程大致可以分为两种状态:
4.1.Wait Pool:
wait()方法继承自Object类,调用对象的wait()方法,会使线程放弃当前对象锁,暂停执行并进入Wait Pool,只有调用notify()/notifyAll()方法,线程才会被唤醒,进入Lock Pool,当线程重新获取对象锁,线程进入就绪状态
4.2.Blocked Pool
sleep(long)方法会令线程暂停执行指定的时间,并且依然持有对象锁,当休眠时间结束后,线程会自动回到就绪状态.
5.死亡(Dead):
5.1.当线程的run()方法执行完毕,线程就会自然地进入死亡状态
5.2.当线程的run()方法发送一个未捕获的异常,或者Thread执行了其stop()方法(不安全,过时方法),或Thread的interrupt()方法,将会终止线程的执行.值得注意的是,即使是用于取代stop()方法的interrupt()方法,仍然存在一定的问题.
线程提供了一个方法isAlive()判断线程是否还存活