JVM把线程分为6种状态,分别是新建(New)、运行(Runnable)、无期限等待(Waiting)、一定时间的等待(Timed Waiting)、阻塞(Blocked)、结束退出(Terminated),如下图:
新建(New):
线程创建后还未启动
运行(Runnable):
包括了Ready和Running两种状态,也就是说此状态的线程可能在等待CPU执行权,也可能正在执行
无期限等待(Waiting):
处于此种状态的线程不会被分配CPU执行时间,它们要等待其它线程显示的唤醒,即调用notify()或notifyAll()方法。以下方法会让线程进入无期限等待状态:
没有设置参数的wait()方法,即wait(0)方法
没有设置参数的join()方法,即join(0)方法
LockSupport.park()方法
一定时间的等待(Timed Waiting):
处于这种状态的线程也不会被分配CPU的执行权,不过它不需要等待其它线程的唤醒,在一定时间后它们会由系统自动唤醒,以下方法会让线程进入有时间的等待:
sleep()方法
设置了参数的wait()方法
设置了参数的join()方法
LockSupport.parkNanos()方法
LockSupport.parkUntil()方法
阻塞(Blocked):
线程被阻塞了,在程序等待进入同步区域的时候处于这种状态。阻塞状态与等待状态的区别是阻塞状态在等待着获取到一个排它锁,这个事件将在另外一个线程放弃这个锁时发生,而等待状态是在等待一段时间或者被唤醒动作发生。
结束退出(Terminated):
线程运行结束或终止。
JVM线程分析工具
jstack:
jstack(stack trace for java),java堆栈跟踪工具,用于生成JVM当前时刻的线程快照,用于定位线程出现长时间停顿的原因,如线程死锁、死循环、请求外部资源导致长时间的等待等原因。
jstack命令格式:
jstack [option] JVM进程号
option参数为:
-F:当正常输出的请求不被响应,强制输出线程堆栈
-l:除堆栈外,显示关于锁的附加信息
-m:如果调用到本地方法的话,可以显示C/C++的堆栈
如下代码为查看tomcat的线程(只显示部分):
[root@java ~]# jstack -l 24685
2012-12-05 17:03:17
Full thread dump Java HotSpot(TM) 64-Bit Server VM (20.5-b03 mixed mode):
"Attach Listener" daemon prio=10 tid=0x00007fb278001000 nid=0x1924 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
Locked ownable synchronizers:
- None
"TP-Monitor" daemon prio=10 tid=0x00007fb2a035a000 nid=0x60a8 in Object.wait() [0x00007fb29c1f0000]
java.lang.Thread.State: TIMED_WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x00000000e0634468> (a org.apache.tomcat.util.threads.ThreadPool$MonitorRunnable)
at org.apache.tomcat.util.threads.ThreadPool$MonitorRunnable.run(ThreadPool.java:565)
- locked <0x00000000e0634468> (a org.apache.tomcat.util.threads.ThreadPool$MonitorRunnable)
at java.lang.Thread.run(Unknown Source)
Locked ownable synchronizers:
- None
......
VisualVM:
JVM强大的图形界面分析工具,如下图查看Eclipse的运行,该工具可以查看到监控的进程中所有线程的执行状态
该文章学习 周志明 深入理解Java虚拟机 JVM高级特性与最佳实践 记录
分享到:
相关推荐
Java多线程生命周期的讲解,很详细,希望能帮到大家
Java线程生命周期是Java编程中的核心概念,它关乎程序的并发执行和性能优化。线程在Java中扮演着至关重要的角色,特别是在多任务处理和实时系统中。理解线程的生命周期有助于开发者更有效地管理和控制程序运行流程。...
Java线程状态流转图是一种用于描述Java线程生命周期中不同的状态和状态转换的图形表示方式。该图形展示了Java线程从创建到终止的整个生命周期,并详细介绍了每种状态的特点和转换规则。 NEW(初始化状态) 在Java...
### Java线程生命周期 Java线程有五种基本状态:新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)和死亡(Terminated)。线程的状态会随着程序的运行而变化: 1. **新建**:当创建了一个新的线程...
正确管理线程生命周期是防止死锁、资源浪费和提高程序效率的关键。合理设计线程间的协作,使用线程池来控制线程数量,以及正确处理异常,都是编写多线程程序时应考虑的重要因素。理解并掌握Java线程的生命周期转换有...
以图表形式详细列出java线程生命周期,创建线程,线程就绪,线程阻塞,线程中断,线程唤醒,线程运行之间的关系
### Java多线程之线程的生命周期和状态控制 #### 一、线程的生命周期 在Java中,线程的生命周期是指线程从创建到结束的整个过程。根据线程的状态变化,我们可以将线程的生命周期划分为以下几个阶段: 1. **新建...
【Java线程生命周期与优先级】 在Java程序设计中,线程是程序执行的独立路径,它使得程序可以并发地执行多个任务。线程的生命周期包括五个基本状态:新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked...
Java 中的线程生命周期主要包括以下几个阶段:新建(New)、可运行(Runnable)、运行(Running)、等待(Waiting)、阻塞(Blocked)、死亡(Dead)。在 Java 中,我们可以通过使用 Thread 的生命周期来实现多线程...
Java线程的生命周期是每个Java多线程开发者必须了解的重要概念。线程在它的整个生命周期中会经历五个基本状态:新建(New)、就绪(Runnable)、...理解和掌握线程生命周期对于编写高效、稳定的多线程程序至关重要。
线程生命周期的终点是死亡状态。线程在以下三种情况下结束:`run()`方法执行完毕、执行过程中抛出未捕获异常或错误,或者调用已过时的`stop()`方法。 6. 等待(Waiting): 从JDK1.5开始,线程可以进入等待状态,这...
#### 二、Java线程生命周期及创建方式 **2.1 线程的生命周期** Java线程有以下几种状态: - **新建 (New):** 当我们使用`new Thread()`创建一个新的线程对象时,线程处于新建状态。 - **就绪 (Runnable):** ...
本文将深入探讨Java线程的概念、生命周期、实现方式以及相关的同步机制。 首先,理解线程的基本概念至关重要。线程是程序中一个单一的顺序控制流,它在程序的上下文中运行,但具有独立的执行路径。多线程则是指在...
在探讨Java多线程和线程生命周期时,我们首先应该明确,Java多线程是Java语言支持并发编程的一个重要特性,其允许同时执行多个任务,以提高程序的执行效率和改善用户体验。Java中的每个线程都有自己的生命周期,由一...
初学Java多线程线程的生命周期.pdf
本文将深入探讨Java线程的生命周期,包括创建、启动、结束以及线程的协作和调度。 首先,创建Java线程有两种主要方式:直接实例化`Thread`类或者创建一个新的类去继承`Thread`类并重写`run()`方法。例如,你可以...
"Java线程的生命周期和状态控制" Java线程的生命周期是指从线程创建到线程结束的整个过程,而状态控制是指线程在不同的状态之间的转换。Java线程的生命周期主要包括五个状态:新建状态、就绪状态、运行状态、阻塞...
浅析Java语言中线程的生命周期及实现方式 Java语言中的线程(Thread)是指在同一个进程中可以并发执行的多个控制流程。线程是Java语言中定义的非常重要的基本概念和技术标准。随着整个社会信息化的发展,传统服务器...
在Java中,线程的生命周期包含五个基本状态,分别是新建状态(New)、就绪状态(Runnable)、运行状态(Running)、阻塞状态(Blocked)和死亡状态(Dead)。了解这些状态对于掌握Java多线程编程至关重要。 新建...
线程的生命周期包括新建(New)、可运行(Runnable)、运行(Running)、阻塞(Blocked)、等待(Waiting)、超时等待(Timed Waiting)和终止(Terminated)七个状态。Java提供了多种方法来控制线程状态,如`start...