JAVA的线程状态

JAVA的线程状态:
NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING、TERMINATED;
要获取Java线程的状态可以使用 java.lang.Thread类中定义的 getState()方法,获取当前线程的状态就可以使用Thread.currentThread().getState()来获取。
该方法返回的类型是一个枚举类型,是Thread内部的一个枚举,全称为“java.lang.Thread.State”。
JAVA线程状态说明:
NEW:线程创建但没有执行start()方法的状态;

RUNNABLE:处于此状态的线程正在执行或者在等待系统资源;

BLOCKED: 当一个线程要进入synchronized语句块/方法时,如果没有获取到锁,会变成BLOCKED,或者在调用Object.wait()后,被notify()唤醒,再次进入synchronized语句块/方法时,如果没有获取到锁,会变成BLOCKED;
处于BLOCKED状态的线程,即使对其调用 thread.interrupt()也无法改变其阻塞状态,因为interrupt()方法只是设置线程的中断状态,即做一个标记,不能唤醒处于阻塞状态的线程.
ReentrantLock.lock()操作后进入的是WAITING状态,其内部调用的是LockSupport.park()方法.

WAITING(无限期等待):处于这种状态的线程不会被分配CPU执行时间,它们要等待显示的被其它线程唤醒。这种状态通常是指一个线程拥有对象锁后进入到相应的代码区域后,调用相应的“锁对象”的wait()方法操作后产生的一种结果。变相的实现还有LockSupport.park()、Thread.join()等,它们也是在等待另一个事件的发生,也就是描述了等待的意思。
以下方法会让线程陷入无限期等待状态:
(1)没有设置timeout参数的Object.wait()
(2)没有设置timeout参数的Thread.join()
(3)LockSupport.park()
“阻塞”与“等待”的区别:
(1)“阻塞”状态是等待着获取到一个排他锁,进入“阻塞”状态都是被动的,离开“阻塞”状态是因为其它线程释放了锁,不阻塞了;
(2)“等待”状态是在等待一段时间 或者 唤醒动作的发生,进入“等待”状态是主动的.

TIMED_WAITING(限期等待):处于这种状态的线程也不会被分配CPU执行时间,不过无需等待被其它线程显示的唤醒,在一定时间之后它们会由系统自动的唤醒。
以下方法会让线程进入TIMED_WAITING限期等待状态:
(1)Thread.sleep()方法
(2)设置了timeout参数的Object.wait()方法
(3)设置了timeout参数的Thread.join()方法
(4)LockSupport.parkNanos()方法
(5)LockSupport.parkUntil()方法

TERMINATED(结束):已终止线程的线程状态,线程已经结束执行.

你可能感兴趣的:(JAVA)