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中的线程状态:
两个队列
等待队列
WAITING和TIMED_WAITING状态的线程会被放到等待队列中,等待队列中的线程只有其它线程调用特殊动作(如:notify/notifyAll)才会从等待队列移到阻塞队列。
阻塞队列
阻塞队列中的线程会一直阻塞,直到获取锁的线程释放了锁,此时OS会从阻塞队列中选择一个线程执行。
类似于操作系统中的记录型信号量,信号量维持了int变量(锁状态)和阻塞队列(获取该信号量失败的线程队列),java中Block状态的线程都是阻塞线程,这些线程都会挂到阻塞队列上。