介绍

线程的状态划分中操作系统的(也可说是早期的单线程状态划分)和java线程的状态有些许不同。其中操作系统的线程状态分为五种,java线程的线程状态分为六种。

操作系统线程状态

新建状态(NEW)

当用new操作符创建一个线程操作时,例如new Thread(r),线程还没有开始运行,此时线程处于新建状态。当一个线程处于新生状态时,程序还没有开始运行线程中的代码。

就绪状态(RUNNABLE)

一个新创建的线程并不自动开始运行,要执行线程,必须调用start()方法。当线程对象调用start()方法即启动了线程,start()方法创建线程运行的系统资源,并调度线程运行run()方法,当start()方法返回后,线程就处于就绪状态。

运行状态(RUNNING)

当线程获得cpu时间后,它进入运行状态,真正开始执行run()方法。

阻塞状态(BLOCKED)

阻塞状态是正在运行的线程没有运行结束,暂时让出cpu,这时其他处于就绪状态的线程就可以获得cpu时间,进入运行状态。

死亡状态(DEED)

有两个原因会导致线程死亡 (1)run方法正常退出而自然死亡。 (2)一个未捕获的异常终止了run方法而线程猝死。

状态图

操作系统线程状态图

java线程状态

新建状态(NEW)

线程刚被创建,但还没有调用start()方法。

运行状态(RUNNABLE)

正在java虚拟机中运行。但是在操作系统层面,对应就绪或者运行两种状态。所以该状态是指可以被运行,具体有没有运行要看底层操作系统的资源调度。

阻塞状态(BLOCKED)

线程阻塞与锁;请求获取monitor lock时其他线程已经占用了该monitor lock。需要得到monitor lock才可以进入RUNNABLE。

等待状态(WAITTING)

等待其他线程显式地唤醒。阻塞与等待的区别在于阻塞是被动的获取monitor lock。而等待是主动,通过调用Object.wait()等方法进入。

超时等待状态(TIME_WAITTING)

无需等待其他线程显式地唤醒,在一定时间后被系统自动唤醒。通常是调用Thread.sleep()方法。

中止状态(TERMINATED)

可以是线程结束任务之后结束也可产生异常而结束。

状态图

java线程状态图