目录
一、线程的状态有几种?
NEW:创建状态
RUNNABLE:可运行状态(运行状态)
WAITING:等待状态
TIMED_WAITING:超时等待状态
BLOCKED:阻塞状态
TERMINATED:销毁状态(终止状态)
共6种。
二、每种状态表示的含义?
NEW 新建态 | 使用new关键字创建一个thread对象,刚刚创建出的这个线程对象就处于new状态。在这个状态的线程 因为没有调用start(),仅仅是一个java对象。 |
RUNNABLE 可运行态(运行态) | 可工作的,又可以分为正在工作中的和即将开始工作的。只有处于可运行状态的线程才会得到CPU资源。 |
WAITING 等待态 | 无限期等待另一个线程执行特定操作(通知 或 中断),需要显式的被唤醒 |
TIMED_WAITING 超时等待态 | 有限期的等待另一个线程执行特定操作,与Waiting不同:达到一定时间后会自动唤醒。 |
BLOCKED 阻塞态 | 在可运行阶段 争抢锁失败的线程就会从可运行变阻塞。 |
TERMINATED 销毁态(终止态) | 工作完成了,释放所有资源。 |
状态说明:
- NEW 新建态:Thread t = new Thread()后,就进入了new状态,没有调用start()方法,在堆中仅仅给分配了内存。
- RUNNABLE 可运行态:当调用线程对象的start(),调用了start()方法后,线程就进入了就绪状态。处于就绪状态的线程,只是说明此线程已经做好了准备 所有需要的资源都已经准备就绪,随时等待CPU调度执行,只有处于就绪状态的线程才能有机会进入到运行状态,并不是说明 执行了t.start()后,此线程就会立即执行。所以 可运行态Runnable包含Ready就绪➕Running运行中。
- BLOCKED 阻塞状态:在可运行阶段 争抢锁失败的线程就会从 可运行状态转为阻塞状态。当线程处于阻塞状态时,调度器将忽略线程,不会分配给线程任何CPU时间。
- WAITING 等待状态:无限时。可运行状态 争抢锁成功,但是资源不足,主动放弃锁,无期限的等待 直到 条件满足再恢复可运行态,需要被显式的唤醒(notify()或者 notifyAll()唤醒等待的线程)。
- TIMED_WAITING 超时等待态:有时限的的等待。一般有两种方式可以进入超时等待状态:wait(Long milliseconds) 和 sleep(Long milliseconds)。
- TERMINATED 销毁态(终止态):线程退出run(),就进入了终止态。
三、线程状态转换