线程启动原理
image.png线程生命周期
阻塞状态分为Blocked,time-waiting.外在表现区别不大,产生的原因不同,可以通过jstack查看,更具体的状态有助于我们排查线程相关问题。
线程生命周期.png
下面这个时更为详细的生命周期图
image.png
线程停止
- stop方法:不建议使用,类似于
kill -9
,不够优雅 - interrupt():通过
Thread.currentThread().isInterrupted()
来判断,类似于外部提供一个信号thread.interrupt(); //该方法是一个native方法
- 线程复位:当线程捕获InterruptedException时,会自动复位。如果需要继续中断,需要手动在Catch部分重新中断。因为抛中断一场多是堵塞线程时发现,捕获异常同时有唤醒功能。是否继续中断的选择权在于开发者。
排查问题
- CPU占用率很高
top -c 查看pid
top -H -p [pid]
print "0x%x\n" [新pid]
jstack [pid] | grep -A 20 [上一步16进制结果:占用CPU多的线程]
- CPU占用率不高,但是响应很慢(死锁)
jstack [进程] -可以看到类似Found one Java-level deadlock
并且会有线程详细信息
网友评论