
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
线程与进程问题我们在前几期的文章中就给大家分析过很多次了,而本文我们就再来了解一下,线程状态都有哪些类型。
1、NEW
线程刚刚被创建,也就是已经new过了,但是还没有调用start()方法,这个状态我们使用jstack进行线程栈dump的时候基本看不到,因为是线程刚创建时候的状态。
2、RUNNABLE
从虚拟机的角度看,线程正在运行状态,状态是线程正在正常运行中,当然可能会有某种耗时计算/IO等待的操作/CPU时间片切换等,这个状态下发生的等待一般是其他系统资源,而不是锁,Sleep等。
处于RUNNABLE状态的线程是不是一定会消耗cpu呢,不一定,像socketIO操作,线程正在从网络上读取数据,尽管线程状态RUNNABLE,但实际上网络io,线程绝大多数时间是被挂起的,只有当数据到达后,线程才会被唤起,挂起发生在本地代码(native)中,虚拟机根本不一致,不像显式的调用sleep和wait方法,虚拟机才能知道线程的真正状态,但在本地代码中的挂起,虚拟机无法知道真正的线程状态,因此一概显示为RUNNABLE。
3、BLOCKED
线程处于阻塞状态,正在等待一个monitorlock。通常情况下,是因为本线程与其他线程共用了一个锁。其他在线程正在使用这个锁进入某个synchronized同步方法块或者方法,而本线程进入这个同步代码块也需要这个锁,终导致本线程处于阻塞状态。
4、WAITING
这个状态下是指线程拥有了某个锁之后,调用了他的wait方法,等待其他线程/锁拥有者调用notify/notifyAll一遍该线程可以继续下一步操作,这里要区分BLOCKED和WATING的区别,一个是在临界点外面等待进入,一个是在理解点里面wait等待别人notify,线程调用了join方法join了另外的线程的时候,也会进入WAITING状态,等待被他join的线程执行结束,处于waiting状态的线程基本不消耗CPU。
5、TIMED_WAITING
该线程正在等待,通过使用了sleep,wait,join或者是park方法。(这个与WAITING不同是通过方法参数指定了大等待时间,WAITING可以通过时间或者是外部的变化解除),线程等待指定的时间。
6、TERMINATED
线程终止,同样我们在使用jstack进行线程dump的时候也很少看到该状态的线程栈。
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请在707945861群中学习了解。