一:线程状态:
操作系统的线程状态一共有:创建,就绪,运行,阻塞,死亡。
创建:生成线程对象,并未调用start()方法
就绪:调用thread.start()方法之后,线程还未被线程调度程序置为当前执行线程之前。
或者线程在wait()时被notify后,或者sleep(1000)完成后。
或者调用了线程的yield()方法后
运行:线程被线程调度程序置为当前执行线程
阻塞:线程wait()中或者sleep()中,或者等待某个锁
死亡:线程run()方法执行完毕;
二:jvm线程堆栈中的线程状态一共有以下:
1、TIMED_WAITING:出现在线程调用了wait(long)或者join(long)或sleep(long)的情况下
在线程堆栈中有两种常见表示:TIMED_WAITING (on object monitor)和TIMED_WAITING (sleeping)
2、WAITING:线程获得一个对象锁后,在该对象上等待其他线程来notify()
在线程堆栈中常见表示:WAITING (on object monitor)
3、BLOCKED:线程在等待临界资源被释放,比如等待另外一个线程释放临界资源
在线程堆栈中常见表示:BLOCKED (on object monitor)
4、RUNNABLE:当获得CPU的使用权时就可运行的线程,所以一次线程堆栈中可以有多个处于RUNNABLE状态的线程。该状态下,线程处于等待的原因,io,cpu时间片,而非锁,sleep().
在线程堆栈中常见表示:
java.lang.Thread.State: RUNNABLE
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(SocketInputStream.java:129)
at java.io.BufferedInputStream.fill(BufferedInputStream.java:218)
at java.io.BufferedInputStream.read(BufferedInputStream.java:237)
三:如何根据线程堆栈判断死锁:
根据死锁的原理,死锁原因可在BLOCKED状态的线程堆栈中找到原因。
如下例子:三个线程因等待不同的锁,处于BLOCKED状态,且A线程等待B线程持有的锁,B等待C持有的锁,而C又等待A持有的锁,造成锁的等待环,形成死锁。
1、线程"UCA_FINTERFACE ResponseListenerThread",已获得锁<0x2b0c5b78>和<0x2b0dc348>和<0x14990288>,等待获取锁<0x14990230>,处在挂起状态
2、 线程"UCA_MAINFRAMESERVICE startupMonitor com.zte.ums.common.fm.wsf.mainframe.FmStartupMonitor"
已获得锁<0x14990230>等待去获取锁<0x2b0c5b08>,
3、线程“UCA-FM:init client model”已获得锁<0x2b0c5b08>和<0x2b0c5ce0>,<0x2b0c5cf0>,等待锁<0x2b0c5b78>
线程1堆栈:
"UCA_FINTERFACE ResponseListenerThread" prio=10 tid=0x06438c00 nid=0x335e0 waiting for monitor entry [0x0869f000]
java.lang.Thread.State: BLOCKED (on object monitor)
at com.zte.ums.common.fm.wsf.msgservice.localdispatcher.LocalAlarmListenerManager.syncAlarmsFromLocalDB(LocalAlarmListenerManager.java:104)
- waiting to lock <0x14990230> (a com.zte.ums.common.fm.wsf.msgservice.localdispatcher.LocalAlarmListenerManager)
at com.zte.ums.common.fm.wsf.msgservice.localdispatcher.LocalSyncManager.syncAlarms(LocalSyncManager.java:86)
at com.zte.ums.common.fm.wsf.dataprovider.AlarmDataProviderImpl.syncAlarmData(AlarmDataProviderImpl.java:213)
- locked <0x2b0dc348> (a com.zte.ums.common.fm.wsf.dataprovider.AlarmDataProviderImpl)
at com.zte.ums.common.fm.wsf.msgservice.AlarmListenerDecorator.syncAlarmData(AlarmListenerDecorator.java:144)
- locked <0x2b0c5b78> (a com.zte.ums.common.fm.wsf.msgservice.AlarmListenerDecorator)
at com.zte.ums.common.fm.wsf.msgservice.initalarmlistener.AlarmQueryFromServerRespListener.initListeners(AlarmQueryFromServerRespListener.java:146)
at com.zte.ums.common.fm.wsf.msgservice.initalarmlistener.AlarmQueryFromServerRespListener.handleQueryResoponse(AlarmQueryFromServerRespListener.java:131)
at com.zte.ums.common.fm.wsf.msgservice.initalarmlistener.AlarmQueryFromServerRespListener.onResponse(AlarmQueryFromServerRespListener.java:92)
- locked <0x14990288> (a com.zte.ums.common.fm.wsf.msgservice.initalarmlistener.AlarmQueryFromServerRespListener)
at com.zte.ums.uep.pfl.finterface.wsf.FServiceProxy$ResponseListenerProxy.onResponse(FServiceProxy.java:682)
at com.zte.ums.uep.pfl.finterface.wsf.ResponseListenerThread.run(ResponseListenerThread.java:165)
线程2堆栈:
: "UCA_MAINFRAMESERVICE startupMonitor com.zte.ums.common.fm.wsf.mainframe.FmStartupMonitor" prio=10 tid=0x06677800 nid=0x2ec40 waiting for monitor entry [0x07d3f000]
java.lang.Thread.State: BLOCKED (on object monitor)
at com.zte.ums.common.fm.wsf.msgservice.AlarmModel.addAlarmListener(AlarmModel.java:93)
- waiting to lock <0x2b0c5b08> (a com.zte.ums.common.fm.wsf.msgservice.AlarmModel)
at com.zte.ums.common.fm.wsf.misc.sound.notifyrule.AlarmNotifyRuleAudioContinusPlayer.init(AlarmNotifyRuleAudioContinusPlayer.java:78)
at com.zte.ums.common.fm.wsf.msgservice.AlarmNotifyRuleManager.init(AlarmNotifyRuleManager.java:117)
at com.zte.ums.common.fm.wsf.msgservice.localdispatcher.LocalAlarmListenerManager.start(LocalAlarmListenerManager.java:48)
- locked <0x14990230> (a com.zte.ums.common.fm.wsf.msgservice.localdispatcher.LocalAlarmListenerManager)
at com.zte.ums.common.fm.wsf.mainframe.FmStartupMonitor.initUponServerStarted(FmStartupMonitor.java:69)
at com.zte.ums.common.fm.wsf.mainframe.FmStartupMonitor.startedup(FmStartupMonitor.java:43)
at com.zte.ums.uep.pfl.mainframe.main.control.WorkFlow$8$1$1.run(WorkFlow.java:1226)
at java.lang.Thread.run(Thread.java:661)
线程3堆栈
"UCA-FM:init client model" prio=10 tid=0x065ed400 nid=0x3265c waiting for monitor entry [0x0793f000]
java.lang.Thread.State: BLOCKED (on object monitor)
at com.zte.ums.common.fm.wsf.msgservice.AlarmListenerDecorator.stop(AlarmListenerDecorator.java:91)
- waiting to lock <0x2b0c5b78> (a com.zte.ums.common.fm.wsf.msgservice.AlarmListenerDecorator)
at com.zte.ums.common.fm.wsf.msgservice.AlarmEventDispatcher.removeAllListener(AlarmEventDispatcher.java:169)
- locked <0x2b0c5cf0> (a java.util.ArrayList)
at com.zte.ums.common.fm.wsf.msgservice.AlarmEventDispatcher.stop(AlarmEventDispatcher.java:109)
- locked <0x2b0c5ce0> (a com.zte.ums.common.fm.wsf.msgservice.AlarmEventDispatcher)
at com.zte.ums.common.fm.wsf.msgservice.AlarmModel.stop(AlarmModel.java:75)
- locked <0x2b0c5b08> (a com.zte.ums.common.fm.wsf.msgservice.AlarmModel)
at com.zte.ums.common.fm.wsf.msgservice.AlarmModel.syncAlarms(AlarmModel.java:170)
- locked <0x2b0c5b08> (a com.zte.ums.common.fm.wsf.msgservice.AlarmModel)
at com.zte.ums.common.fm.wsf.msgservice.SyncAlarmManager.syncAlarms(SyncAlarmManager.java:112)
at com.zte.ums.common.fm.wsf.misc.AlarmModelUpdateManager$1.run(AlarmModelUpdateManager.java:55)
at java.lang.Thread.run(Thread.java:661)