扫码报名慧测Selenium系列公开课

慧测近期开班
9月10日——性能测试
9月16日——测试开发
借助线程堆栈, 可以分析很多类型的问题, CPU的消耗分析即是线程堆栈分析的一个重要内容。 本篇介绍如何解读线程堆栈的状态信息。
Java线程状态有如下几类:

1、NEW
线程刚被创建的时候就是NEW的状态,上代码:

2、RUNNABLE
从虚拟机的角度看,线程处于可运行状态。
那么处于RUNNABLE的线程是不是一定消耗CPU呢?实际上不一定。下面的线程堆栈表示该线程正在从网络读取数据,尽管下面这个线程显示RUNNABLE状态,但实际上网络IO,线程绝大多数时间是被挂起,只有当数据到达之后,线程才被重新唤醒。
挂起发生在本地代码(Native)中,虚拟机根本不知道,不像显式调用了Java的sleep()或者wait()等方法,虚拟机能知道线程的真正状态,但对于本地代码中的挂起,虚拟机无法真正地知道线程状态,因此它一概显示为RUNNABLE。像这种socket IO操作,不会消耗大量的CPU,因为大多时间在等待,只有数据到来之后,才消耗一点点CPU。

再通俗的解释一下,拿张三、李四、王五他们一起修电脑来举个例子:
张三把修电脑这个任务交给李四去干:
(李四——JVM中的线程,王五——本地线程)
1)如果李四接到任务之后自己马上开始干活,这个时候李四反馈给张三的状态就是RUNNABLE,也就是说张三看到的李四的状态和李四的实际状态是一致的,李四真的很忙。那么这时候的RUNNABLE就比较消耗CPU。
2)如果李四接到任务后发现这个活自己干不了,他就把这个任务交给王五去干,这个时候李四反馈给张三的状态也是RUNNABLE,但是王五是否真的在修电脑,张三就不知道了,所以尽管张三看到李四的状态是RUNNABLE,但也未必消耗CPU。
下面的代码就会消耗CPU:

3、BLOCKED
处于BLOCKED状态的线程是不消耗CPU的!
两个线程以上,相互等待synchronized块

简单解释一下上面的代码:
两个线程:t1和t2
假设t1线程被优先运行,t1执行完第56行代码后,就把下面的代码给锁住了,接下来t1会休眠10秒钟,在这期间锁lock是没有被释放的。
接下来t2开始运行,t2线程执行输出“慧测欢迎您”之后,就要去执行56行代码,来获取lock这个锁对象,但是锁仍然被t1所拥有,在这个时刻t2线程的状态就是BLOCKED。

WAITING和TIMED_WAITING状态的代码稍微多些,下次继续哦!
价值3000元的Selenium自动化测试即将免费登场——
就在2017年9月13日晚上20:30分
本系列公开课报名地址:
https://ke.qq.com/course/237510#tuin=3e1d63a
或者扫描下方二维码:

慧测官网:www.huicewang.com
慧测公开课服务群: 623636110
咨询QQ:2657535456
公众号:慧测


