线程状态的那些事
前言
今天我们来探讨下线程的状态,关于线程状态我们会围绕线程的运行流程来分析,方法这块我会尽可能分析线程(Thread
)的每一个方法,由于Runnable
和Callable
有且仅有一个run
方法,所以我们今天讨论的重点是Thread
类,好了,下面让我们详细来看下吧。
线程的状态
线程的状态
首先是线程的状态,一个线程会有如下几种状态:
NEW
:新建状态,线程实例化完成后尚未运行时处于该状态下(Thread state for a thread which has not yet started.
)RUNABLE
:可运行状态,在这种状态下,限制在jvm
正在运行,但是不一定正在运行,它可能在等操作系统的某个资源,比如处理器资源BLOCKED
:阻塞状态,在这种状态下,说明线程正在等一个受监控的锁,拿到这个锁,他就可以进入到同步代码块或者方法中开始运行,或者在调用Object.wait
后重新进入同步代码块或者方法中开始运行。WAITING
:等待状态,线程处于等待状态是由于调用Objecet.wait
、Thread.join
或者LockSupport.part
方法中的任意一个导致的,处于等待状态的线程必须等待其他线程完成特定操作才能恢复,例如,一个线程调用了一个对象的Object.wait()
方法,它必须等待其他线程调用Object.notify()
或者Object.notifyAll()
才能恢复.。调用了Thread.join()
的线程,必须等待其他线程执行完成。TIMED_WAITING
:有时间限制的等待状态,当然从名字上我们也能看出来,这是一种有超时时间的等待状态,达到等待时长时会自动恢复,一个线程进入这种状态,通常是调用了如下方法:Thread.sleep
、带超时时间的Object.wait
、带超时时间的Thread.join
、LockSupport.parkNanos
、LockSupport.parkUntil
TERMINATED
:结束状态,线程运行完成后的状态。
下面这张图就是根据线程的各个状态推演出来的,从这张图中,我们可以很直观的看到各个状态之间的互相转换:
由于线程本身的启动是由系统调度完成的,所以对于线程的运行态JVM
本身是监控不到的,这一点我们可以从start
方法中看到端倪:
首先start
方法是一个同步方法,由synchronized
修饰,同时在start
方法内部调用了另一个方法start0
,这个方法是一个本地方法(由native
修饰,基于C++
开发的)
结语
原本这块的内容是打算周五分享的,但是由于最近太忙了,一直在拖,终于今天抽时间把这块搞完了,当然内容本身和我之前计划是有出入的,原本是计划要和线程的相关方法一起分享的,但是时间和内容上不允许,所以暂时就先分享这么多,关于状态的转换,后续我们再进一步验证。
最近这段时间,真的是忙疯了,自我感觉是从三月至今最忙碌的时间,不过这段忙碌而迷茫的时光也让我想明白了,不论是学习、生活还是工作,我们都应该按照自己的节奏循序渐进,不应该勉强自己,一味地图快,反而会让你丧失兴趣,丧失热情,丧失动力,甚至最后放弃这件事,所以最近一段时间在更新新内容这块我也没有太勉强自己,工作上也并没有特别卷(虽然已经并之前卷了)。
另外,我也意识到对你而言真正有意义的事,应该是你热爱的事,如果单纯遵从欲望或者外界的压力做事,最后你收获的只能是失落和失望。拿我来说,周末玩了好几个小时的游戏,然后刷了多半天的剧,但我感受到的不是愉悦和兴奋,而是一种悠然而生的失落感,不真实感,甚至觉得自己又浪费一天,真的还不如出去走走,晒晒太阳。反而是类似今天这样忙碌了一天,而且解决了很多问题的时刻,我觉得更有意义,更充实,也让我觉得很有成就感。
最后,从我一直以来的经验来说,坚持本身是需要消耗精力的,你只有保持充沛的精力,才能更好地坚持自己想做的事,才能更好地面对一切挑战,克服一切的困难,所以从今天开始和自己和解吧,承认自己的菜和不足,然后按照自己的节奏,养精蓄锐,徐徐前行……人的能量是有周期性的,你要契合自己的精力周期,选择合适的事,否则终有一天你会榨干自己。
今天废话有点多,好了,先说这么多吧,各位小可爱晚安哦!
- END -