干货丨Java线程状态:5种还是6种,到底有何区别?

干货丨Java线程状态:5种还是6种,到底有何区别?_第1张图片

Java是支持多线程的语言之一,它对多线程编程提供了内置的支持,可以使程序同时执行多个执行片段。

 线程的6种状态和转换 

干货丨Java线程状态:5种还是6种,到底有何区别?_第2张图片

*新建

当一个线程对象被创建,但还未调用 start 方法时处于新建状态,此时未与操作系统底层线程关联。

*可运行

调用了 start 方法,就会由新建进入可运行,此时与底层线程关联,由操作系统调度执行。

*终结

线程内代码已经执行完毕,由可运行进入终结,此时会取消与底层线程关联。

*阻塞

当获取锁失败后,由可运行进入 Monitor 的阻塞队列阻塞,此时不占用cpu时间。当持锁线程释放锁时,会按照一定规则唤醒阻塞队列中的阻塞线程,唤醒后的线程进入可运行状态。

*等待

当获取锁成功后,但由于条件不满足,调用了 wait() 方法,此时从可运行状态释放锁进入 Monitor 等待集合等待,同样不占用cpu时间。

当其它持锁线程调用 notify() 或 notifyAll() 方法,会按照一定规则唤醒等待集合中的等待线程,恢复为**可运行状态。

*有时限等待

当获取锁成功后,但由于条件不满足,调用了 wait(long) 方法,此时从可运行状态释放锁进入 Monitor 等待集合进行有时限等待,同样不占用cpu时间。

当其它持锁线程调用 notify() 或 notifyAll() 方法,会按照一定规则唤醒等待集合中的**有时限等待**线程,恢复为可运行状态,并重新去竞争锁。如果等待超时,也会从有时限等待状态恢复为可运行状态,并重新去竞争锁。

还有一种情况是调用 sleep(long) 方法也会从可运行状态进入有时限等待状态,但与 Monitor 无关,不需要主动唤醒,超时时间到自然恢复为可运行状态。可以用 interrupt() 方法打断等待、有时限等待的线程,让它们恢复为可运行状态,park,unpark 等方法也可以让线程等待和唤醒。

 五种状态 

五种状态的说法来自于操作系统层面的划分。

干货丨Java线程状态:5种还是6种,到底有何区别?_第3张图片

运行态:分到 cpu 时间,能真正执行线程内代码的。

就绪态:有资格分到 cpu 时间,但还未轮到它的。

阻塞态:没资格分到 cpu 时间的,涵盖了 java 状态中提到的阻塞、等待、有时限等待.多出了阻塞 I/O,指线程在调用阻塞 I/O 时,实际活由 I/O 设备完成,此时线程无事可做,只能干等。

新建与终结态:与 java 中同名状态类似,不再啰嗦。

0812f1d7538b42766a9a988acd445c62.png82b1c7909a17467ffd9876eabb142d2c.png5fcc643a295a871b155c436c6fb90bef.png

以上就是播妞为大家分享的干货内容

希望对你有所帮助

 黑马程序员 

累计培养30余万名优质IT人才

8大学科火热报名中

基础班仅需 28 元,扫码免费咨询

干货丨Java线程状态:5种还是6种,到底有何区别?_第4张图片

线上课程咨询联系播妞(微信:heiniu526)

干货丨Java线程状态:5种还是6种,到底有何区别?_第5张图片

丨热门教程资源免费领丨

回复【领取资源】领《黑马8学科汇总教程》

回复【1026】领《SpringBoot2全套》

回复【瑞吉外卖】领《瑞吉外卖项目教程》

回复【mysql1】领《Mysql入门到精通》

回复【毕业设计】领《Java毕业设计项目》

更多教程加播妞领取:heiniu526

(在下方公众号回复对应关键词,即可领取哦)

↓↓↓

干货丨Java线程状态:5种还是6种,到底有何区别?_第6张图片

你可能感兴趣的:(java,多线程,并发编程,编程语言,linux)