前言
这篇文章主要是讲本人对于线程状态的一些理解,仅供参考。如有不足,欢迎大家点评。
正文
首先先解释一下什么是线程状态,线程一共分为五大状态。
新建状态:当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!你们的评论就是我发文的动力!!!