【线程状态】

前言

这篇文章主要是讲本人对于线程状态的一些理解,仅供参考。如有不足,欢迎大家点评。

正文

首先先解释一下什么是线程状态,线程一共分为五大状态。

新建状态:当new创建线程对象时

就绪状态(可运行状态)Runnable:

调用start()方法后。所需资源都已经获取到,就差cpu资源。

运行状态,时间片到了,cpu调度到其他线程,次线程处于就绪状态

运行状态Running:就绪状态获取到cpu资源后进入到运行状态

阻塞状态(等待状态,不可运行状态,休眠状态):线程等待某个资源,被某个资源阻塞,比如i/o

终止状态:线程运行结束。

具体关系可以看线程状态图(见图1-1)。

                                                                  图1-1

当线程被创建并启动以后,它既不是一启动就进入了执行状态,也不是一直处于执行状态。

在线程的生命周期中,它要经过新建 (New)、就绪 (Runnable)、运行 (Running)、阻塞 (Blocked) 和终止(Terminated)5 种状态。

当线程启动以后,它不可能一直占用 CPU 独自运行,所以 CPU 需要在多条线程之间切换,于是线程状态也会多次在运行、阻塞之间切换。

首先,一个新创建的线程并不自动开始运行,要执行线程,必须调用线程的start()方法。当线程对象调用start()方法即启动了线程,start()方法创建线程运行的系统资源,并调度线程运行run()方法。当start()方法返回后,线程就处于就绪状态(Runnable)。随后在线程调度中会出现阻塞事件,wait等待,sleep休眠三种状态,其中最重要的就是阻塞状态。那么问题来了什么是阻塞状态呢?

什么是线程阻塞?

在某一时刻某一个线程在运行一段代码的时候,这时候另一个线程也需要运行,但是在运行过程中的那个线程执行完成之前,另一个线程是无法获取到CPU执行权的(调用sleep方法是进入到睡眠暂停状态,但是CPU执行权并没有交出去,而调用wait方法则是将CPU执行权交给另一个线程),这个时候就会造成线程阻塞。

这里先讲解两种阻塞方法

sleep方法,当一个线程执行代码的时候调用了sleep方法后,线程处于睡眠状态,需要设置一个睡眠时间,此时有其他线程需要执行时就会造成线程阻塞,而且sleep方法被调用之后,线程不会释放锁对象,也就是说锁还在该线程手里,CPU执行权还在自己手里,等睡眠时间一过,该线程就会进入就绪状态。也可以形容为:”在其位不谋其职“。

wait方法,这里以后会涉及死锁的知识点(ps:可以点个关注等后续更新哦),当一个线程正在运行时,调用了wait方法,此时该线程需要交出CPU时间片的执行权,也就是将锁释放出去,交给另一个线程,该线程进入等待状态,但与Sleep睡眠状态不一样的是,进入等待状态的线程不需要设置睡眠时间,他自己是不会主动醒来的,等被唤醒之后,该线程也会进入就绪状态,但是进入就绪状态的该线程手里是没有执行权的,也就是没有锁,而睡眠状态的线程一旦苏醒,进入就绪状态时是自己还拿着锁的。等待状态的线程苏醒后,就是典型的“一梦百年,物是人非“啊;

总结

喜欢的老铁点个关注和喜欢( •̀ ω •́ )y!你们的评论就是我发文的动力!!!

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值