欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java线程间状态转换

程序员文章站 2022-03-26 16:40:05
首先我们还是以一个牛客网上错题例子来引入:下面来看下线程间的状态转换:1.新建(new):新创建了一个线程对象。2.可运行(runnable):线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取cpu的使用权。3.运行(running):可运行状态(runnable)的线程获得了cpu时间片(timeslice),执行程序代码。4.阻塞(block):阻塞状态是指线程因为某种原因放弃了cpu使用权,也即让出了cp...

首先我们还是以一个牛客网上错题例子来引入:
Java线程间状态转换
下面来看下线程间的状态转换:

1.新建(new):新创建了一个线程对象。

2.可运行(runnable):线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取cpu的使用权。

3.运行(running):可运行状态(runnable)的线程获得了cpu时间片(timeslice),执行程序代码。

4.阻塞(block):阻塞状态是指线程因为某种原因放弃了cpu使用权,也即让出了cpu timeslice,暂时停止运行。直到线程进入可运行(runnable)状态,才有机会再次获得cpu timeslice转到运行(running)状态。 阻塞的情况分为三种:

发、、
(1)等待阻塞:
运行(running)的线程执行o.wait(),JVM会把该线程放入等待队列(waitting queue)中。

(2)同步阻塞:
运行(running)的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入锁池(look pool)中。

(3)其他阻塞:
运行(running)的线程执行Thread.sleep(long ms)或t.join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入可运行状态(runnable)状态。

5.死亡(dead):
线程run()、main()方法执行结束,或者因异常退出了run()方法,则该线程结束生命周期。死亡的线程不可再次复生。

对上面的内容进行总结即线程从新建到结束一般有五个状态,为新建、可运行、运行、阻塞、结束,其中阻塞不是必经状态!下面我们再以一张图来看一下线程间关系:
Java线程间状态转换
其中对上图总结几个点:

对于等待阻塞,即调用了对象的wait()方法,而这个方法会释放锁,接下来通过对象的notify()和notifyAll()唤醒,锁池状态中拿到锁的线程可以进入就绪状态(即可运行状态)。

对于同步阻塞,即synchronized,会使线程进入锁池状态,拿到锁的即可进入就绪状态。

对于其他阻塞,即包括了sleep()的调用(不释放锁),join()的调用(释放锁),以及用户输入,当sleep()结束,join()完成以及用户输入完成,就会从阻塞状态进入到可运行状态。

yield()是Thread的静态方法,作用当前线程,释放当前线程持有的cpu资源,将cpu让给优先级不低于自己的线程用,调用后从运行状态进入可运行状态。

本文地址:https://blog.csdn.net/weixin_44741522/article/details/107892332

相关标签: JAVA线程