线程状态的那些事

云中志

共 1863字,需浏览 4分钟

 ·

2021-11-18 13:43


前言

今天我们来探讨下线程的状态,关于线程状态我们会围绕线程的运行流程来分析,方法这块我会尽可能分析线程(Thread)的每一个方法,由于RunnableCallable有且仅有一个run方法,所以我们今天讨论的重点是Thread类,好了,下面让我们详细来看下吧。

线程的状态

线程的状态

首先是线程的状态,一个线程会有如下几种状态:

  • NEW:新建状态,线程实例化完成后尚未运行时处于该状态下(Thread state for a thread which has not yet started.

  • RUNABLE:可运行状态,在这种状态下,限制在jvm正在运行,但是不一定正在运行,它可能在等操作系统的某个资源,比如处理器资源

  • BLOCKED:阻塞状态,在这种状态下,说明线程正在等一个受监控的锁,拿到这个锁,他就可以进入到同步代码块或者方法中开始运行,或者在调用Object.wait后重新进入同步代码块或者方法中开始运行。

  • WAITING:等待状态,线程处于等待状态是由于调用Objecet.waitThread.join或者LockSupport.part方法中的任意一个导致的,处于等待状态的线程必须等待其他线程完成特定操作才能恢复,例如,一个线程调用了一个对象的Object.wait()方法,它必须等待其他线程调用Object.notify()或者Object.notifyAll()才能恢复.。调用了Thread.join()的线程,必须等待其他线程执行完成。

  • TIMED_WAITING:有时间限制的等待状态,当然从名字上我们也能看出来,这是一种有超时时间的等待状态,达到等待时长时会自动恢复,一个线程进入这种状态,通常是调用了如下方法:Thread.sleep、带超时时间的Object.wait、带超时时间的Thread.joinLockSupport.parkNanosLockSupport.parkUntil

  • TERMINATED:结束状态,线程运行完成后的状态。

下面这张图就是根据线程的各个状态推演出来的,从这张图中,我们可以很直观的看到各个状态之间的互相转换:

由于线程本身的启动是由系统调度完成的,所以对于线程的运行态JVM本身是监控不到的,这一点我们可以从start方法中看到端倪:

首先start方法是一个同步方法,由synchronized修饰,同时在start方法内部调用了另一个方法start0,这个方法是一个本地方法(由native修饰,基于C++开发的)

结语

原本这块的内容是打算周五分享的,但是由于最近太忙了,一直在拖,终于今天抽时间把这块搞完了,当然内容本身和我之前计划是有出入的,原本是计划要和线程的相关方法一起分享的,但是时间和内容上不允许,所以暂时就先分享这么多,关于状态的转换,后续我们再进一步验证。

最近这段时间,真的是忙疯了,自我感觉是从三月至今最忙碌的时间,不过这段忙碌而迷茫的时光也让我想明白了,不论是学习、生活还是工作,我们都应该按照自己的节奏循序渐进,不应该勉强自己,一味地图快,反而会让你丧失兴趣,丧失热情,丧失动力,甚至最后放弃这件事,所以最近一段时间在更新新内容这块我也没有太勉强自己,工作上也并没有特别卷(虽然已经并之前卷了)。

另外,我也意识到对你而言真正有意义的事,应该是你热爱的事,如果单纯遵从欲望或者外界的压力做事,最后你收获的只能是失落和失望。拿我来说,周末玩了好几个小时的游戏,然后刷了多半天的剧,但我感受到的不是愉悦和兴奋,而是一种悠然而生的失落感,不真实感,甚至觉得自己又浪费一天,真的还不如出去走走,晒晒太阳。反而是类似今天这样忙碌了一天,而且解决了很多问题的时刻,我觉得更有意义,更充实,也让我觉得很有成就感。

最后,从我一直以来的经验来说,坚持本身是需要消耗精力的,你只有保持充沛的精力,才能更好地坚持自己想做的事,才能更好地面对一切挑战,克服一切的困难,所以从今天开始和自己和解吧,承认自己的菜和不足,然后按照自己的节奏,养精蓄锐,徐徐前行……人的能量是有周期性的,你要契合自己的精力周期,选择合适的事,否则终有一天你会榨干自己。

今天废话有点多,好了,先说这么多吧,各位小可爱晚安哦!

- END -


浏览 19
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报