本文章介绍 Java Thread State各种状态.通过本篇文章你可以了解到:
1 Java 线程中都有哪些状态
2 这些状态之间的联系是怎样的
3 使用jstack查看运行中的线程状态
Java 线程中的状态
其实只要看下Thread.State源码就可以知道有几种类型了
1 | public enum State { |
这些状态之间的联系是怎样的
具体见下图(图源《Java 并发编程艺术》4.1.4节)
![[title]](/2019/11/25/java/thread-state/image-20191125232222723.png)
从上图可以到
1 初始化线程状态表示为New. 调用Thread.start()转换状态为RUNNABLE
2 调用Object.wait()/Object.join()/LockSupport.park会由RUNNABLE转换为WAITING转态。调用Object.notify()/Object.notifyAll()/LockSupport.unpark()才会由,WAITING转为RUNABLE
3 调用Thread.sleep(long)/Object.wait(long)/Thread.join(long)/LockSupport.pardNanos(long)/LockSupport.parkUntil(long) 由 RUNNABLE-> TIMED_WAITING
反之通过Object.notify()/Object.notifyAll()/LockSupport.unpark()才会由,TIMED_WAITING转为RUNABLE
4 在调用synchronized函数时候,未获取到锁,会变为BLOCKED。 获取到之后即变为RUNNABLE
5 执行完成之后转换为TERMINATED
使用jstack查看运行中的线程状态
NEW
1
2
3
4
5
6
7@Test
public void testNew() {
Thread thread = new Thread();
System.out.println(thread.getState()); // NEW
}RUNNABEL && WAITING
1
2
3
4
5
6
7
8
9
10
11
12
13
14@Test
public void testRunnable() throws InterruptedException {
Thread testRunnable = new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < Integer.MAX_VALUE; i++) {
System.out.println(i);
}
}
}, "testRunnable");
testRunnable.start();
testRunnable.join();
}
testRunnable 线程是在运行
![[title]](/2019/11/25/java/thread-state/image-20191125234826763.png)
main此时状态为WAITING. 因为调用了thread.join函数
![[title]](/2019/11/25/java/thread-state/image-20191125235543225.png)
BLOCKED && WAITING
1 | public static void main(String[] args){ |
可以看下图中 A TIMED_WAITING B因为A获取到了lock,而为BLOCKED状态
![[title]](/2019/11/25/java/thread-state/image-20191126001024171.png)