Thread.State

转载自:http://blog.csdn.net/codetomylaw/article/details/40263261
              http://blog.csdn.net/fenglibing/article/details/6411940

       一般查看Java程序堆栈信息时,会使用jstack工具来获得java stack和native stack的信息,如果现在运行的java程序呈现hung的状态,jstack是非常有用的。
       如果是在64位机器上,需要指定选项 -J-d64,Windows的jstack使用方式只支持jstack [-l] pid。
       命令格式:
jstack [ option ] pid
jstack [ option ] executable core
      常用参数说明:
-F   当’jstack [-l] pid’没有相应的时候强制打印栈信息
-l   长列表. 打印关于锁的附加信息,例如属于java.util.concurrent的ownable synchronizers列表.
-m   打印java和native c/c++框架的所有栈信息.
-h | -help   打印帮助信息

       jstack Dump日志文件中的线程状态中值得关注的线程状态有:
       死锁,Deadlock,死锁线程,一般指多个线程调用间,进入相互资源占用,导致一直等待无法释放的情况。
      执行中,Runnable
       等待资源,Waiting on condition,等待资源,或等待某个条件的发生。
       等待获取监视器,Waiting on monitor entry
       暂停,Suspended
       对象等待中,Object.wait() 或 TIMED_WAITING
       阻塞,Blocked,是指当前线程执行过程中,所需要的资源长时间等待却一直未能获取到,被容器的线程管理器标识为阻塞状态,可以理解为等待资源超时的线程。
       停止,Parked。

       Monitor是Java中用以实现线程之间的互斥与协作的主要手段,它可以看成是对象或者Class的锁。每一个对象都有也仅有一个monitor。从下图中可以看出,每个Monitor在某个时刻,只能被一个线程拥有,该线程就是“Active Thread”,而其它线程都是“Waiting Thread”,分别在两个队列“ Entry Set”和“Wait Set”里面等候。在“Entry Set”中等待的线程状态是“Waiting for monitor entry”,而在“Wait Set”中等待的线程状态是 “in Object.wait()”。
      

解释一下waiting for monitor entry、waiting on condition 、in Object.wait():

       “waiting for monitor entry”意味着线程在等待进入一个临界区 ,所以它在”Entry Set“队列中等待。此时线程状态一般都是Blocked:
       • java.lang.Thread.State: BLOCKED (on object monitor)

       “waiting on condition”说明线程在等待另一个条件的发生来把自己唤醒,或者干脆它是调用了sleep(N)。此时线程状态大致为以下几种:
       java.lang.Thread.State: WAITING (parking):一直等那个条件发生;
       java.lang.Thread.State: TIMED_WAITING (parking或sleeping):定时的,那个条件不到来,也将定时唤醒自己。

       “in Object.wait()”说明线程获得了监视器之后,又调用了 java.lang.Object.wait() 方法。当线程获得了Monitor,如果发现线程继续运行的条件没有满足,它则调用对象(一般就是被synchronized的对象)的wait()方法,放弃了Monitor,进入“Wait Set”队列。
此时线程状态大致为以下几种:
       java.lang.Thread.State: TIMED_WAITING (on object monitor);
       java.lang.Thread.State: WAITING (on object monitor);
       一般都是RMI相关线程(RMI RenewClean、 GC Daemon、RMI Reaper),GC线程(Finalizer),引用对象垃圾回收线程(Reference Handler)等系统线程处于这种状态。
       建议在Java程序中应该尽量减少线程处于“waiting for monitor entry”状态,其次是“in Object.wait()”状态。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值