1 操作系统中的线程状态
- 创建:线程从创建到被cpu执行之前的这个阶段。
- 就绪:指线程已具备各种执行条件,一旦获取cpu便可执行。
- 运行:表示线程正获得cpu在运行。
- 阻塞:指线程在执行中因某件事而受阻,处于暂停执行的状态,阻塞的线程不会去竞争cpu。
- 终止:线程执行完毕,接下来会释放线程占用的资源。
线程的生命周期图如下(进程与线程生命周期一样):
2 Java中线程的状态
Thread类中维护类一个内部枚举类State,里面是线程的状态,属性如下:
- NEW:表示未启动的线程。
- RUNNABLE:表示线程正在JVM中执行,但执行的动作也可能是“等待”:等待操作系统的某些资源如处理器。
- BLOCKED:表示线程正在等待一个锁去进入某个同步方法或同步代码块。
- WAITING:表示因为调用接下来的方法,线程正在等待。包括:Object.wait()、Thread.join()和LockSupport.part()。直到另外一个线程执行一个特殊的动作该线程才会退出等待状态。如:该线程调用Object.wait(),需要另外一个线程调用Object.notify()或Object.notifyAll()。
- TIMED_WAITING:表示线程因为调用接下来的方法,线程正在等待,等待时间最多为一个具体的值。包括:Thread.sleep(time)、Object.wait(time)、Thread.join(time)、LockSupport.parkNanos(time)和LockSupport.parkUntil(time)。直到另外一个线程执行一个特殊的动作该线程才会退出等待状态。如:该线程调用Object.wait(3000),另外一个线程调用Object.notify()或Object.notifyAll()可以使该线程退出等待状态。
- TERMINATED:表示一个终止的线程,这个线程的执行已经完成。
生命周期图如下,下面红色字体是操作系统中对应Java中的线程状态:
注意Java中,当线程执行到同步代码区,若线程被执行等待方法,则线程会释放锁并进入等待状态,等待状态的线程不会参与锁的竞争,即若其它持有锁的线程执行完成后不会唤醒处于等待状态的线程,而阻塞状态的线程可能会被唤醒。等待状态的线程被唤醒后会从等待队列移除,加入到阻塞队列中,参与锁的竞争。