对wait的线程没有调用notify()导致的结果就是程序无法停止。
o.notify(); //必须,否则无法停止程序

public class T06_00_sync_wait_notify {public static void main(String[] args) {final Object o = new Object();char[] aI = "1234567".toCharArray();char[] aC = "ABCDEFG".toCharArray();new Thread(()->{synchronized (o) {for(char c : aI) {System.out.print(c);try {o.notify();o.wait(); //让出锁} catch (InterruptedException e) {e.printStackTrace();}}// o.notify(); //必须,否则无法停止程序}}, "t1").start();new Thread(()->{synchronized (o) {for(char c : aC) {System.out.print(c);try {o.notify();o.wait();} catch (InterruptedException e) {e.printStackTrace();}}o.notify();}}, "t2").start();}
}

使用jstack进行分析:

2020-04-30 21:12:49
Full thread dump OpenJDK 64-Bit Server VM (11.0.5+10-post-Ubuntu-0ubuntu1.118.04 mixed mode, sharing):Threads class SMR info:
_java_thread_list=0x00007f724c001ea0, length=11, elements={0x00007f72900a3800, 0x00007f72900a5800, 0x00007f72900ab000, 0x00007f72900ad000,
0x00007f72900af000, 0x00007f72900b1000, 0x00007f72900e8800, 0x00007f72900ed800,
0x00007f72900f9800, 0x00007f7290014800, 0x00007f724c001000
}"Reference Handler" #2 daemon prio=10 os_prio=0 cpu=0.15ms elapsed=70.83s tid=0x00007f72900a3800 nid=0x8ea waiting on condition  [0x00007f72783b3000]java.lang.Thread.State: RUNNABLEat java.lang.ref.Reference.waitForReferencePendingList(java.base@11.0.5/Native Method)at java.lang.ref.Reference.processPendingReferences(java.base@11.0.5/Reference.java:241)at java.lang.ref.Reference$ReferenceHandler.run(java.base@11.0.5/Reference.java:213)"Finalizer" #3 daemon prio=8 os_prio=0 cpu=0.31ms elapsed=70.83s tid=0x00007f72900a5800 nid=0x8eb in Object.wait()  [0x00007f72782b2000]java.lang.Thread.State: WAITING (on object monitor)at java.lang.Object.wait(java.base@11.0.5/Native Method)- waiting on <0x00000000d43024f8> (a java.lang.ref.ReferenceQueue$Lock)at java.lang.ref.ReferenceQueue.remove(java.base@11.0.5/ReferenceQueue.java:155)- waiting to re-lock in wait() <0x00000000d43024f8> (a java.lang.ref.ReferenceQueue$Lock)at java.lang.ref.ReferenceQueue.remove(java.base@11.0.5/ReferenceQueue.java:176)at java.lang.ref.Finalizer$FinalizerThread.run(java.base@11.0.5/Finalizer.java:170)"Signal Dispatcher" #4 daemon prio=9 os_prio=0 cpu=0.43ms elapsed=70.82s tid=0x00007f72900ab000 nid=0x8ec runnable  [0x0000000000000000]java.lang.Thread.State: RUNNABLE"C2 CompilerThread0" #5 daemon prio=9 os_prio=0 cpu=10.71ms elapsed=70.82s tid=0x00007f72900ad000 nid=0x8ed waiting on condition  [0x0000000000000000]java.lang.Thread.State: RUNNABLENo compile task"C1 CompilerThread0" #6 daemon prio=9 os_prio=0 cpu=24.92ms elapsed=70.82s tid=0x00007f72900af000 nid=0x8ee waiting on condition  [0x0000000000000000]java.lang.Thread.State: RUNNABLENo compile task"Sweeper thread" #7 daemon prio=9 os_prio=0 cpu=0.53ms elapsed=70.81s tid=0x00007f72900b1000 nid=0x8ef runnable  [0x0000000000000000]java.lang.Thread.State: RUNNABLE"Service Thread" #8 daemon prio=9 os_prio=0 cpu=0.08ms elapsed=70.77s tid=0x00007f72900e8800 nid=0x8f0 runnable  [0x0000000000000000]java.lang.Thread.State: RUNNABLE"Common-Cleaner" #9 daemon prio=8 os_prio=0 cpu=0.27ms elapsed=70.76s tid=0x00007f72900ed800 nid=0x8f2 in Object.wait()  [0x00007f7268e64000]java.lang.Thread.State: TIMED_WAITING (on object monitor)at java.lang.Object.wait(java.base@11.0.5/Native Method)- waiting on <0x00000000d439b4c0> (a java.lang.ref.ReferenceQueue$Lock)at java.lang.ref.ReferenceQueue.remove(java.base@11.0.5/ReferenceQueue.java:155)- waiting to re-lock in wait() <0x00000000d439b4c0> (a java.lang.ref.ReferenceQueue$Lock)at jdk.internal.ref.CleanerImpl.run(java.base@11.0.5/CleanerImpl.java:148)at java.lang.Thread.run(java.base@11.0.5/Thread.java:834)at jdk.internal.misc.InnocuousThread.run(java.base@11.0.5/InnocuousThread.java:134)"t2" #11 prio=5 os_prio=0 cpu=0.38ms elapsed=70.75s tid=0x00007f72900f9800 nid=0x8f4 in Object.wait()  [0x00007f7268c62000]java.lang.Thread.State: WAITING (on object monitor)at java.lang.Object.wait(java.base@11.0.5/Native Method)- waiting on <0x00000000d439d560> (a java.lang.Object)at java.lang.Object.wait(java.base@11.0.5/Object.java:328)at T06_00_sync_wait_notify.lambda$main$1(T06_00_sync_wait_notify.java:31)- waiting to re-lock in wait() <0x00000000d439d560> (a java.lang.Object)at T06_00_sync_wait_notify$$Lambda$2/0x0000000840060c40.run(Unknown Source)at java.lang.Thread.run(java.base@11.0.5/Thread.java:834)"DestroyJavaVM" #12 prio=5 os_prio=0 cpu=69.22ms elapsed=70.75s tid=0x00007f7290014800 nid=0x8e3 waiting on condition  [0x0000000000000000]java.lang.Thread.State: RUNNABLE"Attach Listener" #13 daemon prio=9 os_prio=0 cpu=0.73ms elapsed=44.86s tid=0x00007f724c001000 nid=0x92f waiting on condition  [0x0000000000000000]java.lang.Thread.State: RUNNABLE"VM Thread" os_prio=0 cpu=3.33ms elapsed=70.84s tid=0x00007f72900a1000 nid=0x8e9 runnable  "GC Thread#0" os_prio=0 cpu=0.39ms elapsed=70.86s tid=0x00007f729002d000 nid=0x8e4 runnable  "G1 Main Marker" os_prio=0 cpu=0.38ms elapsed=70.85s tid=0x00007f7290043000 nid=0x8e5 runnable  "G1 Conc#0" os_prio=0 cpu=0.04ms elapsed=70.85s tid=0x00007f7290044800 nid=0x8e6 runnable  "G1 Refine#0" os_prio=0 cpu=0.38ms elapsed=70.85s tid=0x00007f7290074800 nid=0x8e7 runnable  "G1 Young RemSet Sampling" os_prio=0 cpu=10.06ms elapsed=70.85s tid=0x00007f7290076000 nid=0x8e8 runnable
"VM Periodic Task Thread" os_prio=0 cpu=48.15ms elapsed=70.77s tid=0x00007f72900eb000 nid=0x8f1 waiting on condition  JNI global refs: 4, weak refs: 0

jstack命令案例分析:对wait的线程没有调用notify()导致程序无法停止相关推荐

  1. GIt思维导图命令+案例分析

    文章目录 0.思维导图and速查命令图表 1.配置user信息 2.创建第一个仓库并配置local用户信息 3.往仓库中提交文件commit 4.给文件重命名的简便方法 5.通过git log 查看版 ...

  2. mysql先删后增并发时出现死锁_MySQL死锁案例分析一(先delete,再insert,导致死锁)...

    一.死锁案例 MySQL版本:Percona MySQL Server 5.7.19 隔离级别:可重复读(RR) 业务逻辑:并发下按某个索引字段先delete记录,再insert记录 比如:begin ...

  3. Java命令学习系列—Jstack命令(转载)

    jstack是java虚拟机自带的一种堆栈跟踪工具 1. 功能 jstack用于生成java虚拟机当前时刻的线程快照.线程快照是当前java虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主 ...

  4. 使用jstack命令dump线程信息

    jstack是java虚拟机自带的一种堆栈跟踪工具,jstack用于打印出给定的java进程ID或远程调试服务的java堆栈信息. 线程状态 想要通过jstack命令来分析线程的情况的话,首先要知道线 ...

  5. jstack命令 详解

    1.介绍 jstack用于打印出给定的java进程ID或core file或远程调试服务的Java堆栈信息,如果是在64位机器上,需要指定选项"-J-d64",Windows的js ...

  6. jstack命令详解(linux jstack命令详解)

    几种常见的操作tomcat的linux命令 重启tomcat ps x 查看pid kill -9 pid 杀死进程 /app/tomcat/bin/startup.sh 启动tomcat 追踪日志 ...

  7. jstack命令的使用

    文章来源:https://blog.csdn.net/wufaliang003/article/details/80414267 jstack是java虚拟机自带的一种堆栈跟踪工具. jstack用于 ...

  8. jstack命令应用

    0 概述 jstack 命令用于生成虚拟机当前时刻线程快照(一般称为threaddump 或者javacore 文件).线程快照就是当前虚拟机内每一条线程正在执行的方法堆栈集合,生成线程快照的目的主要 ...

  9. jstack定位CPU占用率高的线程代码

    目录 一.背景 二.jstack定位实战演示 三.关于线程的状态 四.最后 一.背景 性能测试过程中,如果我们发现应用服务器CPU使用率高(超过70%),接口TPS低的现象,此时常见的情况是由以下的原 ...

最新文章

  1. do{}while(0) 作用
  2. OO实现ALV TABLE 九:ALV的事件
  3. gitlab 更新文件_GitLab任意文件读取漏洞公告
  4. mysql安装及一些注意点
  5. linux虚拟文件系统(四)-文件系统挂载操作分析
  6. Hive和HBase的区别
  7. IOS第五天(2:用户登录,回车的监听(代理模式UITextFieldDelegate)) 和关闭键盘
  8. Android系统进程间通信(IPC)机制Binder中的Client获得Server远程接口过程源代码分析(3)...
  9. HTML5重要知识点整理
  10. 《Java大学教程》—第23章 Java网络编程
  11. python threading join_浅谈Python中threading join和setDaemon用法及区别说明
  12. 山东大学高频电子线路实验五 混频器实验详解
  13. 谷歌生物医学专用翻译_干货| 三款精选文献翻译神器,助力文献阅读!
  14. Web版RSS阅读器(一)——dom4j读取xml(opml)文件
  15. ftps软件android,透视相机软件ftp
  16. NC7WZ14P6X绝对最大额定参数
  17. java datasource使用_DataSource 使用方法
  18. 志强系列的服务器能吃鸡吗,性能芯变化!三款至强E5 V3服务器体验
  19. 一款APP从设计稿到切图过程全方位揭秘
  20. c语言rgb数值颜色渐变算法,颜色渐变算法

热门文章

  1. 【时间序列】NeuralProphet:Prophet的Pytorch实现!精度更高 预测更快 特性更多!...
  2. 【Python基础】在pandas中利用hdf5高效存储数据
  3. 用户偏好类结构化数据分析题参赛总结
  4. 数据科学真的是一份有前途的工作吗?
  5. 网易云信亮相WOT, 打造“IM+连麦互动直播”云服务
  6. 在创业公司,不懂运维的程序员如何兼顾公司的运维工作
  7. SpringMVC重定向传参
  8. 关于vue-cli创建项目(小白)(2)mock数据
  9. redis-rdb-tools来解析分析reids dump文件及内存使用量
  10. System.InvalidOperationException:“线程间操作无效: 从不是创建控件“txtPortName02”的线程访问它。”...