问题
|
|
Java
虚拟机所暴露的线程状态,与操作系统底层的线程状态是两个不同层面的事
JVM线程状态
JVM
中定义的线程状态有以下几种:
|
|
blocked
和waiting
状态的区别
blocked
是虚拟机认为程序还不能进入某个区域,因为同时进去就会有问题,这是一块临界区wait
操作的先决条件是要进入临界区,也就是线程已经拿到锁了,自己可能进去做了一些事情,但此时通过判定业务上的参数,发现还有一些其他配合的资源没有准备充分,那么自己就等等再做其他事情。
sleep()
和wait()
操作的区别
sleep
是Thread
类的静态方法,wait
是Object
类中定义的方法Thread.sleep
不会导致锁行为的改变,如果当前线程是拥有锁的,那么Thread.sleep
不会让线程释放锁;Object.wait
会释放锁,进入等待队列中wait
不带计时参数是WAITING
状态,带计时参数是TIMED_WAITING
状态;不管是通过notify()
唤醒还是超时时间已到,都需要重新获取锁才能继续执行
线程start方法
|
|
start()
方法是同步的,而且执行前会判断当前线程状态是否为NEW
;也就是说,同一个线程只能执行一次
网络阻塞线程状态
|
|
使用jstack
查看线程状态:
|
|
可见JVM线程状态为RUNNABLE
;I/O 阻塞也是如此
注意:进行传统上的 IO 操作时,我们也会说“阻塞”,但这个“阻塞”与线程的BLOCKED
状态是两码事
|
|