JVM线程在给定时间点只能处于一种状态,这些状态是虚拟机的状态,不反映任何操作系统线程状态。可以处于以下六种状态之一:

java线程blocked影响 线程 blocked_1024程序员节

1.NEW(创建)
创建态:当一个已经被创建的线程处于未被启动时,即:还没有调用start方法时,就处于这个状态。

2.RUNNABLE(运行时)
运行态:当线程已被占用,在Java虚拟机中正常执行时,就处于此状态。

3.BLOCKED(排队时)
阻塞态:当一个线程试图获取一个对象锁,而该对象锁被其他的线程持有,则该线程进入Blocked状态。当该线程持有锁时,该线程将自动变成RUNNABLE状态。

4.WAITING(休眠)
休眠态:一个线程在等待另一个线程执行一个(唤醒)动作时,该线程进入Waiting状态。进入这个状态后是不能自动唤醒的,必须等待另一个线程调用notify或者notifyAll方法才能够唤醒。

5.TIMED_WAITING (指定休眠时间)
指定时间休眠态:基本同WAITING状态,多了个超时参数,调用对应方法时线程将进入TIMED_WAITING状态,这一状态将一直保持到超时期满或者接收到唤醒通知,带有超时参数的常用方法有Thread.sleep、锁对象.wait() 。

6.TERMINATED (结束)

结束态:从RUNNABLE状态正常退出而死亡,或者因为没有捕获的异常终止了RUNNABLE状态而死亡。


java线程blocked影响 线程 blocked_thread_02



BLOCKED、WAITING和TIMED_WAITING状态的区别:

BLOCKED锁阻塞:

比如,正在运行的线程A与线程B代码中使用同一锁,如果线程A获取到锁,线程A进入到RUNNABLE状态,那么线程B就进入到Blocked锁阻塞状态。

java线程blocked影响 线程 blocked_thread_03

WAITING锁无限等待:

waiting状态并不是一个线程的操作,它体现的是多个线程间的通信,可以理解为多个线程之间的协作关系, 多个线程会争取锁.。当多个线程协作时,比如A,B线程,如果A线程在RUNNABLE(可运行)状态中调用了wait()方法那么A线程就进入 了WAITING(无限等待)状态,同时失去了同步锁。假如这个时候B线程获取到了同步锁,在运行状态中调用了notify()方法,那么就会将无限等待的A线程唤醒。注意是唤醒,如果获取到锁对象,那么A线程唤醒后就进入RUNNABLE(可运行)状态;如果没有获取锁对象,那么就进入到BLOCKED(锁阻塞)状态。

java线程blocked影响 线程 blocked_并发编程_04

TIMED_WAITING计时等待:

一个正在限时等待另一个线程执行唤醒动作的线程处于这一状态。比如我们在run()方法中添加了sleep()语句,这样就强制当前正在执行的线程休眠(暂停执行),以“减慢线程”,这就是所谓的TIMED_WAITING(计时等待)。

进入TIMED_WAITING 状态的一种常见情形是调用sleep()方法,单独的线程也可以调用,不一定非要多线程。要注意的是,sleep()中指定的时间是线程不会运行的最短时间。因此sleep()方法不能保证该线程睡眠到期后就开始立刻执行,关键还是要看取到锁没有,如果到期没取到锁就会进入BLOCKED锁阻塞状态。

java线程blocked影响 线程 blocked_1024程序员节_05