动力节点旗下在线教育品牌  |  咨询热线:400-8080-105 学Java全栈,上蛙课网
首页 > 文章

轻松辨别Java线程状态转换

06-17 19:06 408浏览
举报 T字号
  • 大字
  • 中字
  • 小字

 

在一个时间点,每个线程有且只有一种状态,反应线程当前的状况。如何判断当前的线程状态以及Java线程状态转换是我们学习线程的重中之重我们结合线程状态的转换图来聊一聊各种线程状态以及它们之间的转换

1、新建状态(New):新创建了一个线程对象但还没有调用start()方法。有三种方式新建线程对象,分别是继承Thread类重写run()方法,实现Runnable接口重写其run()方法,实现Callable接口且有返回值。

2、就绪状态(Runnable):就绪状态也称准备状态或者可执行状态。线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于可运行线程池中,变得可运行,等待获取CPU的使用权。运行中的线程在时间片用完或者调用Thread.yield()方法的情况下会进入就绪状态。

3、运行状态(Running):就绪状态的线程获取了CPU,执行程序代码。在cpu调度资源后开始执行,变为运行状态。hread.yield()方法翻译为让步,就是说一个线程调用这个方法后,它就会把自己cpu执行的时间让掉,退出cpu运行,再与其他线程共同争取cpu运行资源,并不是让给其他线程,只是让出,再同时一起竞争。

4、超时等待和等待状态:运行中的线程调用了以下方法会进入超时等待状态:Thread.sleep(long millis)Object.wait(long)thread.join(long)。当线程过了等待时长后自动变为运行状态,或者调用Object.notifly()Object.notiflyAll()方法。thread.join(long)方法为Thread类的非静态方法,线程对象才能调用。thread2.join()为确保thread2执行完,thread2.join(2000)为等待thread2执行2000ms,不管是否执行完毕。处于等待中的线程需主要的去唤醒,否则将一直处于等待状态。运行状态的线程调用了Object.wait()Thread.join()方法进入等待状态,调用Object.notifly()Object.notiflyAll()方法唤醒线程,进入运行状态。超时等待和等待状态一大区别为等待状态的线程不会释放同步资源,超时等待线程会释放同步资源。分别对应的是wait()sleep(long)方法。

5、阻塞状态(Blocked):阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。阻塞的情况分三种:

(一)、等待阻塞:运行的线程执行wait()方法,JVM会把该线程放入等待池中。(wait会释放持有的锁)

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

(三)、其他阻塞:运行的线程执行sleep()join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。(注意,sleep是不会释放持有的锁)

6、死亡状态(Dead):线程执行完了或者因异常退出了run()方法,该线程结束生命周期。线程终止后不能再复生。

 

 

2人推荐
共同学习,写下你的评论
0条评论
呵呵呀
程序员呵呵呀

3篇文章贡献11902字

作者相关文章更多>

推荐相关文章更多>

支付接口的幂等性设计

军哥08-05 15:18

一文梳理REST API的设计原则

军哥09-01 10:54

如何在Linux系统下开发java程序

jessy06-15 17:31

彻底解决java JDK注册表残留问题

天天天天天歌06-15 17:38

浅谈Java设计模式-之-适配器模式

调技师傅09-01 16:47

发评论

举报

0/150

取消