大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为****博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的知识进行总结与归纳,不仅形成深入且独到的理解,而且能够帮助新手快速入门。
本文主要介绍了线程生命周期,希望能对学习线程的同学们有所帮助。
文章目录
- 1. 综述
- 2. 线程的生命周期
1. 综述
一个jar包可以叫做程序,当在命令行输入java -jar
时,运行了程序,启动了进程。一个java程序一般来讲至少存在三个线程:main()主线程,gc()垃圾回收线程,异常处理线程。在java中public static void main()
里的代码被称为主线程代码,主线程代码里还可以显性(开发人员写代码的方式)创建多个子线程以及孙线程,子线程/孙线程发生异常不一定会影响主线程。垃圾回收线程、异常处理线程不在主线程下显性写明,是由系统/Java虚拟机(具体是什么不确定,但肯定不是开发人员)帮我们起的,一旦发生异常都会影响主线程。
一般情况下,即不做特别声明,父线程与子线程相互不影响,即子线程结束,父线程不一定结束;父线程结束,子线程不一定结束;父线程异常,子线程不一定异常;子线程异常,父线程不一定异常。但当我们设置守护线程等特殊操作时,父线程与子线程就会发生相互影响。具体后续会一一讲解
一般情况下,多个子线程之间也相互不影响,但设置了线程锁,进行线程通信时有可能会发生影响,后续详解。
2. 线程的生命周期
- 无论是主线程,还是子线程,抑或是异常处理线程、垃圾回收线程都有生命周期,具体如下:
- 新建:创建一个线程的对象,新生的线程对象处于新建状态
- 准备就绪:新建状态的线程对象调用方法(java是start方法),将进入线程队列等待CPU时间片,此时它已经具备了运行的条件,只是还没分配到CPU资源
- 运行:当就绪的线程被调度且获得CPU资源时,进入运行状态(系统自动决定cpu分配,并执行获得cpu执行权的线程)。
- 阻塞:在某种特殊情况下,如被人挂起或执行输入输出操作时,让出CPU并临时中断自己的执行,进入阻塞状态
- 死亡:线程完成了它的全部工作或线程被提前强制终止或出现异常导致。
线程的生命周期共有五种状态:新建、准备就绪、运行、阻塞、死亡
线程新建后可以切换至准备就绪状态;准备就绪状态可以切换至运行状态;运行状态可以切换至准备就绪状态或阻塞状态或死亡状态;
从运行状态切换到死亡状态,线程结束
从运行状态切换至准备就绪状态,可重新从准备就绪状态进行再次切换
从运行状态切换至阻塞状态,阻塞状态可切换至准备就绪状态,然后重新从准备就绪状态进行下一次切换。