课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
线程是程序员在学习java编程开发语言的时候需要重点掌握的一个编程知识,下面我们就通过案例分析来了解一下,软件开发线程状态都有哪些。
可运行(runnable)
分成两种子状态,ready和running。分别表示就绪状态和运行状态。
就绪状态
线程对象调用start方法之后,等待JVM的调度(此时该线程并没有运行),这时候线程处于等待CPU分配资源阶段,谁先抢的CPU资源,谁开始执行,换句话说线程已经被启动,正在等待被分配给CPU时间片,也就是说此时线程正在就绪队列中排队等候得到CPU资源。
运行状态
线程对象获得JVM调度,如果存在多个CPU,那么允许多个线程并行运行
被转换成Terminated状态,比如调用stop()方法;
被转换成Blocked状态,比如调用了sleep,wait方法被加入waitSet中;
被转换成Blocked状态,如进行IO阻塞操作,如查询数据库进入阻塞状态;
被转换成Blocked状态,比如获取某个锁的释放,而被加入该锁的阻塞队列中;
该线程的时间片用完,CPU再次调度,进入Runnable状态;
线程主动调用yield方法,让出CPU资源,进入Runnable状态
运行(running)他也从属于Runnable状态,但不在总体状态之内,属于逻辑状态机制
当就绪的线程被调度并获得CPU资源时,便进入运行状态,run方法定义了线程的操作和功能,此时除非此线程自动放弃CPU资源或者有优先级更高的线程进入,线程将一直运行到结束。
注意:
Runnable状态的线程无法直接进入Blocked状态和Terminated状态的。只有处在Running状态的线程,换句话说,只有获得CPU调度执行权的线程才有资格进入Blocked状态和Terminated状态,Runnable状态的线程要么能被转换成Running状态,要么被意外终止。
堵塞(blocked)
正在运行的线程因为某些原因放弃CPU,暂时停止运行,就会进入阻塞状态.此时JVM不会给线程分配CPU,直到线程重新进入就绪状态,才有机会转到运行状态.阻塞状态只能先进入就绪状态,不能直接进入运行状态。
阻塞状态的两种情况:
当A线程处于运行过程时,试图获取同步锁时,却被B线程获取.此时JVM把当前A线程存到对象的锁池中,A线程进入阻塞状态.
当线程处于运行过程时,发出了IO请求时,此时进入阻塞状态.
由于某种原因导致正在运行的线程让出CPU并暂停自己的执行,即进入堵塞状态。
被转换成Terminated状态,比如调用stop()方法,或者是JVM意外Crash;
被转换成Runnable状态,阻塞时间结束,比如读取到了数据库的数据后;
完成了指定时间的休眠,进入到Runnable状态;
正在wait中的线程,被其他线程调用notify/notifyAll方法唤醒,进入到Runnable状态;
线程获取到了想要的锁资源,进入Runnable状态;
线程在阻塞状态下被打断,如其他线程调用了interrupt方法,进入到Runnable状态;
等待状态(waiting)
(等待状态只能被其他线程唤醒):
此时使用的无参数的wait方法,
当线程处于运行过程时,调用了wait()方法,此时JVM把当前线程存在对象等待池中.
计时等待状态(timedwaiting)
(使用了带参数的wait方法或者sleep方法)
当线程处于运行过程时,调用了wait(longtime)方法,此时JVM把当前线程存在对象等待池中.
:当前线程执行了sleep(longtime)方法.
终止状态(terminated)
通常称为死亡状态,表示线程终止.
正常执行完run方法而退出(正常死亡).
遇到异常而退出(出现异常之后,程序就会中断)(意外死亡).
JVM异常结束,所有的线程生命周期均被结束。
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请加danei0707学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。