摘要:先上一张线程状态转换图做如下说明代码中共有除之外的种状态,为了表示线程正在执行,特加了这种状态。但是由于和以及用于协调对共享资源的存取,所以必须在块中使用。所以即便状态的线程被唤醒了,也需要再次获得锁,所以唤醒后进入状态。
1.先上一张线程状态转换图
做如下说明:代码中共有除RUNNING之外的6种状态,为了表示线程正在执行,特加了RUNNING这种状态。我们需要重点关注RUNNABLE、BLOCKED、WAITING和TIME_WAITING四种状态,jstack打印的线程堆栈中也会时时出现。
1)BLOCKED:很好理解,就是线程在等待获取锁进入同步块或者同步方法中。两个死锁的线程即是Blocked。
2)WAITING:比BLOCKED状态进步一些,指我已经获得锁了,但由于有些条件不满足,我自己等会,调用object.wait()方法。等条件满足了,别的线程调用notify再叫我。另外也可以调用Thread.join()方法,顾名思义就是调用别的线程的join方法,让别人join进来先执行,那我就只能等会了。但是由于wait()和notify()以及notifyAll()用于协调对共享资源的存取,所以必须在synchronized块中使用。所以即便wait状态的线程被notfiy唤醒了,也需要再次获得锁,所以唤醒后进入Blocked状态。
3)TIMED_WAITING:类比WAITING,差异是不需要notify()或者notifyAlL()方法唤醒,时间到了我自己醒了。另外sleep比较好理解,就是让当前线程睡一会,与wait的区别是它不释放锁。
4)RUNNABLE不用多说,在JAVA虚拟机中已经在运行,但是在等待操作系统资源,比如CPU时间片。
2.模拟一段死循环代码
public class NewTask2 implements Runnable{ @Override public void run() { while(true) { System.out.println("the thread name is:" + Thread.currentThread().getName()); } } } public class DemoApplication { public static void main(String[] args) throws Exception { Thread t = new Thread(new NewTask2()); t.run(); }
}
3.运行main函数,查看任务管理器,找到PID,2284
4.使用Process Explorer工具,找到2284进程并查看属性。找到CPU占用最高线程TID,8840
5.将8840换算为16进制,即为2288,记下这个16进制数字
6.在cmd下执行jstack -l PID命令,即jstack -l 2284。可以看到nid=0x2288线程堆栈信息,线程状态为RUNNABLE和执行循环输出的代码行信息。另外也可以看到WAITING状态的线程
简单梳理了下线程状态转移流程并记录一下线程堆栈常用定位方法。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/66716.html
摘要:之前我们简单的讨论了一下关于中的同步还有一些锁优化的问题,今天我们就来简单的聊一聊关于中的死锁问题。这里显示两个线程的状态现在是处于阻塞状态,然后都在等待锁的获取,我们再继续往下看。 之前我们简单的讨论了一下关于Java中的同步还有一些锁优化的问题,今天我们就来简单的聊一聊关于Java中的死锁问题。 这个问题我们在开发的时候,或多或少都能遇到,对业务逻辑没有正确的梳理,又或者是在多线程...
摘要:通过分析线程状态除了上述的分析,大多数情况下会基于分析当前各个线程的运行情况,如是否存在死锁是否存在一个线程长时间持有锁不放等等。 背景 记得前段时间,同事说他们测试环境的服务器cpu使用率一直处于100%,本地又没有什么接口调用,为什么会这样?cpu使用率居高不下,自然是有某些线程一直占用着cpu资源,那又如何查看占用cpu较高的线程? /** *一个线程占用较高的cpu资源 *...
摘要:用于生成虚拟机当前时刻的线程快照。线程快照就是当前虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的就是定位线程出现长时间停顿的原因,如线程死锁死循环请求外部资源导致的长时间等待等都是导致线程长时间停顿的常见原因。 在JDK的命令行中,一般开发人员最耳熟能详的肯定就是java,javac,javap等常用命令,不过在jdk/bin下还有许多其他的命令行工具,它们被用来监...
摘要:点击进入我的博客命令行工具这些工具大多数是类库的一层薄的包装,它们的主要功能代码是在类库中实现的。可视化工具是到目前为止随发布的功能最强大的运行监视和故障处理程序,并且可以预见在未来一段时间内都是官方主力发展的虚拟机故障处理工具。 点击进入我的博客 3.1 JDK命令行工具 showImg(https://segmentfault.com/img/remote/14600000174...
阅读 915·2021-11-17 09:33
阅读 388·2019-08-30 11:16
阅读 2444·2019-08-29 16:05
阅读 3309·2019-08-29 15:28
阅读 1359·2019-08-29 11:29
阅读 1912·2019-08-26 13:51
阅读 3350·2019-08-26 11:55
阅读 1168·2019-08-26 11:31