博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java多线程 - 线程的生命周期
阅读量:5945 次
发布时间:2019-06-19

本文共 794 字,大约阅读时间需要 2 分钟。

线程的生命周期分为:新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)、死亡(Dead)五个阶段。

线程启动后,随着CPU的调度,线程会在运行和阻塞两种状态间切换。

 

新建:使用new关键字创建一个线程后,线程就处于新建状态;

就绪:线程对象调用start方法后,线程处于就绪状态。此时线程能否运行取决于jvm线程调度器的调度;

运行:线程获得CPU后,进入运行状态;

阻塞:未死亡的线程失去CPU后进入阻塞状态;

死亡:线程run()方法执行完成;线程抛出未被捕获的Exception或Error;线程主动调用stop()方法结束当前线程。

 

线程从运行进入阻塞的情况:

  1. 线程调用sleep()方法,主动放弃所占用的处理器资源;
  2. 线程调用了一个阻塞式IO方法,在该方法返回之前,线程被阻塞;
  3. 线程试图获取一个同步监视器,但该同步监视器正被其他线程所持有;
  4. 线程在等待某个通知(notify);
  5. 程序调用了线程的suspend方法将线程挂起

线程从阻塞进入就绪状态:

  1. 调用sleep()方法的线程已经过了指定的时间;
  2. 线程调用的阻塞式IO方法已经返回;
  3. 线程成功获取了同步监视器;
  4. 线程接收到了通知;
  5. 处于挂起状态的线程被调用了resume()方法

线程状态转换图:

关于线程死亡:

  1. 主线程运行结束后,其他线程并不会随之结束。一旦子线程启动后就会拥有和主线程相同的地位。
  2. 可以使用isAlive()判断线程是否死亡,处于就绪、运行、阻塞状态下的线程isAlive()返回true,处于新建、死亡状态下的线程isAlive()返回false。
  3. 对已死亡的线程不可以使用start()使之重新启动。只能对新建的线程调用start()方法,但也只能调用一次。

转载于:https://www.cnblogs.com/amunote/p/4100745.html

你可能感兴趣的文章
个人在 laravel 开发中使用到的一些技巧(持续更新)
查看>>
iOS之KVO
查看>>
数组的代替品
查看>>
BZOJ-1878: [SDOI2009]HH的项链(莫队算法)
查看>>
Python3 定时访问网页
查看>>
两种算法解决查找子串的问题:hdu1711
查看>>
老板,让我们专注的工作【写给老板的一封信】
查看>>
LBS突围:从微信到微博
查看>>
SFB 项目经验-40-Skype for Business-呼入正常-呼出不正常
查看>>
吴忌寒江卓尔批“闪电网络”背后,是链圈和矿圈的的利益之争
查看>>
python的cls,self,classmethod,staticmethod
查看>>
应用系统中常见报表类型解析
查看>>
[Silverlight入门系列]使用MVVM模式(9): 想在ViewModel中控制Storyboard动画?
查看>>
3 项目计划
查看>>
SQL Server 2008 下载地址(微软官方网站)
查看>>
如何对已经发布过的InfoPath模板进行修改
查看>>
推荐系统高峰论坛
查看>>
移动互联
查看>>
basic4android 开发教程翻译(三)IDE 小贴士
查看>>
obj-c 定义一个类
查看>>