关于java线程状态,网上有很多错误的图。下面是个人认为比较合理的解释。
由Thread.State的定义可知,java中线程共有6种状态:
1. NEW
至今尚未启动的线程处于这种状态。
2. RUNNABLE
正在 Java 虚拟机中执行的线程处于这种状态。
3. BLOCKED
受阻塞并等待某个监视器锁的线程处于这种状态。
4. WAITING
无限期地等待另一个线程来执行某一特定操作的线程处于这种状态。
5. TIMED_WAITING
等待另一个线程来执行取决于指定等待时间的操作的线程处于这种状态。
6. TERMINATED
已退出的线程处于这种状态。
Thread类的JDK源码中有这样一段话:
A thread can be in only one state at a given point in time.
These states are virtual machine states which do not reflect any operating system thread states.
即这些是虚拟机状态,它们不反映操作系统的线程状态
我们一般说操作系统线程有5种状态:
新建(NEW)、终止(TERMINATED)、就绪(READY)、运行(RUNNING)、阻塞(BLOCKED)
前面两个状态的对应不用说,那java剩下的4种状态(RUNNABLE、BLOCKED、WAITING、TIMED_WAITING)是怎么对应到“就绪”、“阻塞”、“运行”这三种状态里的呢:
1. RUNNABLE,对应"就绪"和"运行"两种状态,也就是说处于就绪和运行状态的线程在java.lang.Thread中都表现为"RUNNABLE"
2. BLOCKED,对应"阻塞"状态,此线程需要获得某个锁才能继续执行,而这个锁目前被其他线程持有,所以进入了被动的等待状态,直到抢到了那个锁,才会再次进入"就绪"状态
由Thread.State的定义可知,java中线程共有6种状态:
1. NEW
至今尚未启动的线程处于这种状态。
2. RUNNABLE
正在 Java 虚拟机中执行的线程处于这种状态。
3. BLOCKED
受阻塞并等待某个监视器锁的线程处于这种状态。
4. WAITING
无限期地等待另一个线程来执行某一特定操作的线程处于这种状态。
5. TIMED_WAITING
等待另一个线程来执行取决于指定等待时间的操作的线程处于这种状态。
6. TERMINATED
已退出的线程处于这种状态。
Thread类的JDK源码中有这样一段话:
A thread can be in only one state at a given point in time.
These states are virtual machine states which do not reflect any operating system thread states.
即这些是虚拟机状态,它们不反映操作系统的线程状态
我们一般说操作系统线程有5种状态:
新建(NEW)、终止(TERMINATED)、就绪(READY)、运行(RUNNING)、阻塞(BLOCKED)
前面两个状态的对应不用说,那java剩下的4种状态(RUNNABLE、BLOCKED、WAITING、TIMED_WAITING)是怎么对应到“就绪”、“阻塞”、“运行”这三种状态里的呢:
1. RUNNABLE,对应"就绪"和"运行"两种状态,也就是说处于就绪和运行状态的线程在java.lang.Thread中都表现为"RUNNABLE"
2. BLOCKED,对应"阻塞"状态,此线程需要获得某个锁才能继续执行,而这个锁目前被其他线程持有,所以进入了被动的等待状态,直到抢到了那个锁,才会再次进入"就绪"状态
3. WAITING,对应"阻塞"状态,代表此线程正处于无限期的主动等待中,直到有人唤醒它,它才会再次进入就绪状态
4. TIMED_WAITING,对应"阻塞"状态,代表此线程正处于有限期的主动等待中,要么有人唤醒它,要么等待够了一定时间之后,才会再次进入就绪状态
线程状态图如下:
下面三种状态都可以说是“线程阻塞”。如果将阻塞状态按“等待池”和“锁池”进行划分,则是下面这张图:
线程被阻塞可能是由于下面五方面的原因:(《Thinking in Java》)
1.调用sleep(毫秒数),使线程进入睡眠状态。在规定时间内,这个线程是不会运行的。
2.用suspend()暂停了线程的执行。除非收到resume()消息,否则不会返回“可运行”状态。注:这两个方法已过时。
3.用wait()暂停了线程的执行。除非线程收到notify()或notifyAll()消息,否则不会变成“可运行”状态。
4.线程正在等候一些IO操作完成。
5.线程试图调用另一个对象的“同步”方法,但那个对象处于锁定状态,暂时无法使用。