关于JStack中的wait on condition

请教一下 JStack中的wait on condition是什么意思?

我发现,某个线程在jstack中被标识为“wait on condition”时,
下面的线程状态,有时候是:“RUNNABLE”,也有的时候是:“TIMED_WAITING”
至于其他状态,应该也有,只是我只简单看到这两个而已。

[img]http://dl2.iteye.com/upload/attachment/0091/6719/20447b04-a38c-3f75-95e3-92e001d29fb6.png[/img]

那个这个“wait on condition”在jstack中究竟是什么含义呢?
JStack对应的信息在JConsole中一样可以查看。
但是在JConsole中并没有给出“wait on condition”的概念。

[img]http://dl2.iteye.com/upload/attachment/0091/6723/51d8a35c-c558-35da-85a0-34e929416648.png[/img]

另外,jconsole的查看到的线程信息,来源是MBean中的java.lang.management.ThreadMXBean的线程描述信息:
java.lang.management.ThreadInfo
这一点确信无异。(这一点我猜测是JMX通过不同的连接器发布出来的)

[img]http://dl2.iteye.com/upload/attachment/0091/6733/91213646-e913-3d3d-9427-1edbffee119f.png[/img]

0

1个回答

[quote]该状态出现在线程等待某个条件的发生。具体是什么原因,可以结合 stacktrace来分析。最常见的情况是线程在等待网络的读写,比如当网络数据没有准备好读时,线程处于这种等待状态,而一旦有数据准备好读之后,线程会重新激活,读取并处理数据。在 Java引入 NewIO之前,对于每个网络连接,都有一个对应的线程来处理网络的读写操作,即使没有可读写的数据,线程仍然阻塞在读写操作上,这样有可能造成资源浪费,而且给操作系统的线程调度也带来压力。在 NewIO里采用了新的机制,编写的服务器程序的性能和可扩展性都得到提高。
如果发现有大量的线程都在处在 Wait on condition,从线程 stack看, 正等待网络读写,这可能是一个网络瓶颈的征兆。因为网络阻塞导致线程无法执行。一种情况是网络非常忙,几 乎消耗了所有的带宽,仍然有大量数据等待网络读 写;另一种情况也可能是网络空闲,但由于路由等问题,导致包无法正常的到达。所以要结合系统的一些性能观察工具来综合分析,比如 netstat统计单位时间的发送包的数目,如果很明显超过了所在网络带宽的限制 ; 观察 cpu的利用率,如果系统态的 CPU时间,相对于用户态的 CPU时间比例较高;如果程序运行在 Solaris 10平台上,可以用 dtrace工具看系统调用的情况,如果观察到 read/write的系统调用的次数或者运行时间遥遥领先;这些都指向由于网络带宽所限导致的网络瓶颈。另外一种出现 Wait on condition的常见情况是该线程在 sleep,等待 sleep的时间到了时候,将被唤醒[/quote]
参见:[url]http://jameswxx.iteye.com/blog/1041173[/url]

0
iteye_9831
iteye_9831 哦,是我的措辞不当。在这儿向你说一下抱歉! 可能是因为我从网络上搜集到的答案,看到“wait on condition”,就解释为“条件等待”。 找不到为什么这样解释的原因。 我仔细看了java.lang.management.ThreadMXBean描述的信息,对比过后,我怀疑Jconsole、JStack获取的线程信息都来自于ThreadMXBean。而这个“wait on condition”在ThreadMXBean是没有描述的。因为标准的线程状态只有“BLOCKED、RUNNABLE、WAITING、TIMED_WAITING”几种。所以对这个问题比较困惑。 再次向你表示抱歉!!
5 年多之前 回复
chainhou
chainhou 我觉得这个这个回答问题是热心帮忙,而不是说出于一种必然的,这个东西我特别精通才来回答,而你的语气很明显不是一种问或答,甚至讨论问题的态度。
5 年多之前 回复
iteye_9831
iteye_9831 你有实际的代码来验证你所说的吗?而不仅仅是想当然? 按你所说的,处于等待网络连接时,jstack给出的是RUNNABLE,而不是Wait on condition;
5 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
jstack日志深入理解
在分析线上问题时常使用到jstack 命令将当时Java应用程序的线程堆栈dump出来。 面对jstack 日志,我们如何查看? 首先要清楚线程的状态 线程的状态有:new、runnable、running、waiting、timed_waiting、blocked、dead 线程状态变迁图: 各状态说明: New: 当线程对象创建时存在的状态,此时线程不可能执行;
Java性能调优工具——Jstack
一、命令说明 Jstack是Jdk自带的线程跟踪工具,用于打印指定Java进程的线程堆栈信息。 二、参数说明 jstack -l [pid] 注意:windows环境只支持这么一个参数 三、使用示例 jstack -l 5524 > c:\users\Administrator\Desktop\jstack.txt 2018-09-14 12:59:46 Full th...
详解Condition的await和signal等待/通知机制
1.Condition简介 任何一个java对象都天然继承于Object类,在线程间实现通信的往往会应用到Object的几个方法,比如wait(),wait(long timeout),wait(long timeout, int nanos)与notify(),notifyAll()几个方法实现等待/通知机制,同样的, 在java Lock体系下依然会有同样的方法实现等待/通知机制。从整体上来...
ReentrantLock(二):正确使用Condition实现等待与通知
关键字synchronized与wait()和notify()/notifyAll()方法相结合可以实现等待/通知模式。 类ReentrantLock同样可以实现该功能,但是要借助于Condition对象。它具有更好的灵活性,比如可以实现多路通知功能,也就是在一个Lock对象里面可以创建多个Condition(对象监视器)实例,线程对象可以注册在指定Condition中,从而有选择性的进行线程通知
java并发编程——Condition(wait\signal\notify的等待-通知模式 )
是什么Condition组件,以AQS非静态内部类的方式实现,因此Condition初始化的前提是有Lock实例。使用场景需要进程之间有协作的场景,典型的如等待-通知模型,生产-消费模型,比如有界队列:队列满了需要阻塞插入元素的线程,删除操作线程完成后唤醒被阻塞的插入操作线程。队列空了,需要阻塞删除操作线程,当有插入操作线程完成时唤醒被阻塞的删除操作线程;怎样用对比于Object的wait/noti
jstack - 检测死锁、等待、CPU耗时
jstack jstack用于检测死锁 使用jstack跟踪Java进程 虚拟机stack全分析 Java虚拟机工具之堆栈跟踪工具jstack定位死循环       dump日志分析工具  "IBM Thread and Monitor Dump Analyzer for Java" 下载地址:https://www.ibm.com/developerworks/commun...
为什么condition_wait要用while来判断condition条件?
condition_variable使用基本形式如下: lock while(condition) { wait(lock) } https://blog.csdn.net/matrixyy/article/details/50929150  lock后,wait实际上会unlock,然后其他线程才可能通过 lock change condition notify 修改...
【二十二】Java多线程之线程转储和分析(jstack)
示例:用ReentrantLock写一个死锁,thread-1获取lockA后,等待lockB,thread-2获取lockB后,等待lockA。 测试代码 package com.sid; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; /** * @pr...
jstack常规排查问题方式
常规问题排查方式 在多线程程序中,如果出现的问题是数据异常类的问题,比较难排查需要一点点的检查代码。如果说是资源类的问题排查起来相对来说比较简单。常用的命令就是 top/jps 以及ps 定位出是哪个进程。然后通过jstack命令打出这个进程的全部线程堆栈,接下来就是分析打印的堆栈信息了。在堆栈信息里面打印的线程状态有: 死锁,Deadlock(重点关注) 执行中,Runnable ...
Condition的await和signal原理详解(Condition下的生产消费模型)
Condition的await和signal与Object的wait与notify区别: 任何一个Java对象都天然继承于Object类,在线程间实现通信会用到Object的几个方法,如wait(),wait(long timeout),wait(long timeout,int nanos)与notify(),notifyAll()这几个方法实现等待通知机制,同样的,在Java Lock体系有同...
jvm---6.2、jstack分析死锁
jstack分析死锁写一个死锁:先写两个锁,LockA, LockB。 在LockA 的opt 方法中调用LockB 方法,在LockB 的opt 方法中调用LockA 的opt 方法/** * A锁 */ public class LockA { Lock lock = new ReentrantLock(); public void opt(LockB b){ ...
python多线程高级锁condition
多线程编程中如果使用Condition对象代替lock, 能够实现在某个事件触发后才处理数据, condition中含有的方法: - wait:线程挂起,收到notify通知后继续运行 - notify:通知其他线程, 解除其它线程的wai状态 - notifyAll(): 通知所有线程 - acquire和release: 获得锁和解除锁, 与lock类似, - enter和exi...
condition_variable的使用以及与锁的关系
条件变量和互斥锁是多线程的同步和互斥最基础的两种工具,其中互斥锁使用和功能都比较简单,条件变量在使用和理解起来相对就比较困难,不少初学者对于wait函数必须结合一个锁来使用的原则感到困惑,其实官方指导中已经有详尽的解释和案例,但讲的比较简洁,这里从wait函数执行流程来看下条件变量的使用方法和原理。 正确使用流程 thread1: locker.lock() ---1 cv.wait(...
java并发编程—— 六 进程协作:阻塞队列\wait() notify()\ Condition
进程协作的三种常用方式wait()&&notifyAll()要点: wait()中释放该对象的对象锁 notify() notifyAll() wait() 均是Object方法 notify() notifyAll() wait() 必须在 同步方法中(实现线程安全即可)调用 否则抛 java.lang.IllegalMonitorStateException 经典范式,
jstack应用实例,java方法调用阻塞实例,dubbo创建消费者阻塞。
一:问题描述 在一段代码执行前,会写日志,在代码的finally快,也会写日志。现在遇到的问题是finally的代码没有执行。 二:问题查找同事让我看下项目中为什么没有执行结束的日志(该日志可以在管理员界面看到)。我登录系统看到确实没有结束日志,只有开始日志。于是开始查找问题。2.1 jstack 登录系统使用ps -ef|grep java 找到项目的pid,然后jstack pid >> thr
Java多线程学习---Condition和wait、notify(十三)
1.问题:实现两个线程交叉执行(Condition和wait、notify都可以实现) public class ConditionStudy { public static void main(String[] args) { //线程代码 BussinessTest b = new BussinessTest(); new Thread(new Runnable() ...
通过Condition实现wait与指定线程notify
  Object 的 wait / notify / notifyAll 几个方法可以实现对线程的挂起和唤醒。ReentrantLock 也可以,不过要借助我们的 Condition 条件监视器,而且 Object 唤醒部分县城是随机唤醒,Condition 使得线程唤醒是可控的,可以指定唤醒部分线程。 首先我们用 ReentrantLock 和 Condition 实现 Object 中对应的...
c++11多线程中的condition_variable(条件变量)
目录 写在前面 解析 wait函数 wait_for函数 wait_until函数 notify_one函数 notify_all函数 栗子 参考书籍 写在前面 condition_variable条件变量可以阻塞(wait、wait_for、wait_until)调用的线程直到使用(notify_one或notify_all)通知恢复为止 首先要知道condition_v...
Python 多线程 Condition 的使用
ConditionCondition(条件变量)通常与一个锁关联。需要在多个Contidion中共享一个锁时,可以传递一个Lock/RLock实例给构造方法,否则它将自己生成一个RLock实例。可以认为,除了Lock带有的锁定池外,Condition还包含一个等待池,池中的线程处于状态图中的等待阻塞状态,直到另一个线程调用notify()/notifyAll()通知;得到通知...
python使用threading.condition实现生产者消费者
threading模块 threading.Condition() ,返回condition对象,相当于高级锁对象,可以使一个或多个线程等待直到被其他线程调度或通知condition条件对象提供如下方法: 1.threading.Condition() 2.acquire(*args) 获取锁 3.release()释放锁 4.wait([timeout]) 等待 5.notify(n
java利用Condition做超时机制
利用Condition做超时机制,主要是碰到阻塞的代码。我们希望做一个超时。当一直阻塞的时候,主线程也可以继续往下走。而当没有阻塞时,可以直接往下继续走。 我们知道Lock和Condition功能,可以做线程同步用。这里我们做一个超时机制,主要是碰到会阻塞的情况。这时候我们就新建一个线程,然后在主线程中利用Condition的await函数。而在新建的线程中,有一点要特别注意就是这个Lo
Qt4学习笔记(五),QThread学习之QWaitCondition
#include <QThread> #include <QWaitCondition> #include <QMutex> #include <QDebug> const int DataSize = 10000; const int BufferSize = 8192; int buffer1[BufferSize]; QWaitCondit...
Android同步类:Mutex和Condition的使用方式
Metux类Mutex是互斥类,多个线程访问同一个资源时,要确保他们的互斥。 Autolock类是Mutex的一个内部类,方便Mutex的使用。 Condition类是条件类,用于线程唤醒的条件
使用Condition类来代替 Object 监视器方法(wait,notify)
java.util.concurrent.locks 包中,规定了三个接口,来代替synchronized和Object的监视器方法,wait,notify。即帮助我们更加灵活的控制线程的状态和同步。至于如何使用Lock请参考ReentrantLock和synchronized的区别Condition 代替Object的监视器方法,wait,notify。Lock  代替synchronized关...
自己动手实现阻塞队列(基于Condition)
阻塞队列的实现其实就是基于等待通知机制,下面我们进行实现: import java.util.Random; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.ReentrantLock; //我们自己来实现个阻塞队列,主要实现方法是size(),take(),put()即可 publ...
java多线程协作方法之 wait notify condition 的理解
java 多线程协作肯定因为共享对象,实现原理是基于线程挂起和线程恢复。 wait notify condition 都是 基于锁对象产生的衍生方法,多线程之间可以依靠这些方法实现线程协作。 synchronized 的锁原理是在共享对象头里添加标记和对象监控器,这些都是jvm 内部实现的。 而 lock 的锁原理是 独立于共享对象之外 新建一个锁监控对象(锁对象就类似于synchroniz...
Condition使用总结
一、介绍 Condition是在java 1.5中才出现的,它用来替代传统的Object的wait()、notify()实现线程间的协作,相比使用Object的wait()、notify(),使用Condition1的await()、signal()这种方式实现线程间协作更加安全和高效。简单说,他的作用是使得某些线程一起等待某个条件(Condition),只有当该条件具备(signal 或者 s
Golang Cond同步机制
Golang Cond同步机制 条件变量是构建在一个基础锁上的同步原语,Golang Crondition位于sync包中,用于goroutine需要关注特定的条件的场景。 Cond 模块定义: type Cond struct { noCopy noCopy // L is held while observing or changing the condition ...
【java并发】条件阻塞Condition的应用
Condition将Object监视器方法(wait、notify 和 notifyAll)分解成截然不同的对象,以便通过将这些对象与任意Lock实现组合使用,为每个对象提供多个等待 set(wait-set)。其中,Lock 替代了synchronized方法和语句的使用,Condition替代了Object监视器方法的使用。 1. Condition的基本使用   由于Condition可
Linux条件变量pthread_condition细节(为何先加锁,pthread_cond_wait为何先解锁,返回时又加锁)
一览本文目的为何需要条件变量三个问题传入前锁mutex传入后解锁mutex返回前再次锁mutex尾语 本文目的     首先说明,本文重点不在怎么用条件变量。这里我先列出 apue 中对于pthread_cond_wait函数的这么一段话: “ 调用者把锁住的互斥量传给函数,函数然后自动把调用线程放到等待条件的线程列表上,**对互斥量解锁。**这就关闭了条件检查和线程进入休眠状态等待...
Java之wait、await、sleep的区别和联系
一、wait() notify() notifyAll() 调用wait()使得线程等待某个条件满足,线程在等待时会被挂起,当其他线程运行时使得这个条件满足时,其他线程会调用notify()或者notifyAll()来唤醒该挂起的线程。 wait()挂起期间,线程会释放锁。假若线程没有释放锁,那么其他线程就无法进入对象的同步方法或同步控制块中,也就无法执行notify() 和 notifyAl...
linux下使用jstack来找出死循环的java代码
我们使用jdk自带的jstack来分析。当linux出现cpu被java程序消耗过高时,以下过程说不定可以帮上你的忙: 1.top查找出哪个进程消耗的cpu高 21125 co_ad2    18   0 1817m 776m 9712 S  3.3  4.9  12:03.24 java                                                      ...
JAVA性能分析——JStack
JAVA性能分析——JStack
Tomcat 部署java项目大量close_wait导致项目假死
情况说明: 近期项目经常出现负载压力过大的情况,导致项目可以访问但是无法做数据查询操作。 项目部署在两台服务器上,通过nginx 通过ip_hash 机制做分发。而其中一台经常会出现连接数过大导致项目假死的情况。 前期出现无法连接数据库的情况,更改过连接池后此问题不再出现。 问题排查: 1、查看log日志,找寻错误是否有报错。排查于此无关。 2、排查是否为内存溢出导致,经查询后与内存无关。 3...
Java虚拟机工具之堆栈跟踪工具jstack定位死循环
jstack命令用于打印Java进程,core文件或者远程调试服务器的堆栈跟踪记录,它会打印类名,方法名,字节码索引(BCI),如果允许的话,还会打印出行号。jstack主要用于生成线程快照,这样可以定位长时间停顿的原因,比如死锁或者死循环。jstack的命令格式jstack [ options ] pid我在代码里特意写了个死循环,代码如下:/** * Created by kevin on 1
appium封装显示等待Wait类和ExpectedCondition接口
此文已由作者夏鹏授权网易云社区发布。欢迎访问网易云社区,了解更多网易技术产品运营经验。使用WebDriver做Web自动化的时候,org.openqa.selenium.support.ui中提供了非常便捷好用的WebDriverWait类继承FluentWait<WebDriver>,所以可以使用FluentWait类中until方法和ExpectedCondition<T&g...
12.2 Qt5多线程:使用QWaitCondition实现生产者和消费者
Qt5多线程,使用QWaitCondition类实现生产者和消费者问题。
JVM调优之jstack找出最耗cpu的线程并定位代码
jstack可以定位到线程堆栈,根据堆栈信息我们可以定位到具体代码,所以它在JVM性能调优中使用得非常多。下面我们来一个实例找出某个Java进程中最耗费CPU的Java线程并定位堆栈信息,用到的命令有ps、top、printf、jstack、grep。 第一步先找出Java进程ID,服务器上的Java应用名称为mrf-center: root@ubuntu:/# ps -ef | gr...
CyclicBarrier核心代码dowait()方法分析(底层实现机制)
引言:     相信大家对CyclicBarrier并不陌生,当一个线程调用了CyclicBarrier的await方法时,线程阻塞,直到指定数量的线程都执行完await方法后才唤醒所有线程。那么CyclicBarrier的代码底层是如何实现的呢?它和CountDownLatch有什么区别呢?     很显然,CyclicBarrier底层是使用ReentrantLock中的get
Condition Variable与Mutex搭配的前因后果
本来打算用一个形象的生活情况来比喻条件互斥的,但想了再想实在没有想到比较科学贴切的比喻. 那还是开门见山来说吧. Condition Variable无论在C/C++还是C#,JAVA语言里,都会搭配一个Mutex来用. 我们知道Mutex的普通意义上是维持一个互斥变量,从而保证一个或一组操作的原子性. 同样,简单的说Mutex加在Condition Variable上也是为了保证它的原子...