![]()
在上面这段堆栈输出中,可以看到有很多后台线程和main线程,其中只有main线程属于Java用户线程,其他几个都是虚拟机自动创建的,我们分析的过程中,只关心用户线程即可。
从上面的main线程中可以很直观的看到当前线程的调用上下文,其中一个线程的某一层调用含义如下:
at MyTest.fun1(MyTest.java:15)
| | | |
| | | +-----当前正在调用的函数所在的源代码文件的行号
| | +------------当前正在调用的函数所在的源代码文件
| +---------------------当前正在调用的方法名
+---------------------------当前正在调用的类名
另外,堆栈中有:- locked <0x00000000d77d50b8> (a java.lang.Object)语句,表示该线程已经占有柯锁<0x00000000d77d50b8>,尖括号中表示锁ID,这个事系统自动产生的,我们只需要知道每次打印的堆栈,同一个ID表示是同一个锁即可。java多线程死锁每一个线程堆栈的第一行含义如下:
"main" prio=1 tid=0x000000000238e800 nid=0xc940 runnable [0x00000000027af000]
| | | | | |
| | | | | +--线程占用内存地址
| | | | +-----------线程的状态
| | | +----线程对应的本地线程id号
| | +-------------------线程id
| +--------------------------线程优先级
+-------------------------------线程名称
其中需要说明的是,线程对应的本地线程id号,是指Java线程所对应的虚拟机中的本地线程。由于Java是解析型语言,执行的实体是Java虚拟机,因此Java语言中的线程是依附于虚拟机中的本地线程来运行的,实际上是本地线程在执行Java线程代码。
从上面的线程堆栈看,线程堆栈中包含的直接信息为:线程的个数,每个线程调用的方法堆栈,当前锁的状态。线程的个数可以直接数出来;线程调用的方法堆栈,从下向上看,即表示当前的线程调用了哪个类上的哪个方法。而锁得状态看起来稍微有一点技巧。与锁相关的信息如下:
当一个线程占有一个锁的时候,线程的堆栈中会打印--locked<0x00000000d77d50c8>
当一个线程正在等待其它线程释放该锁,线程堆栈中会打印--waiting to lock<0x00000000d77d50c8>
当一个线程占有一个锁,但又执行到该锁的wait()方法上,线程堆栈中首先打印locked,然后又会打印--waiting on <0x00000000d77d50c8>
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-55880-2.html
国内的啤酒也是淡如水