开发者社区> 推荐码发放> 正文

JAVA面试题 线程的生命周期包括哪几个阶段?

简介: JAVA面试题 线程的生命周期包括哪几个阶段?面试官:您知道线程的生命周期包括哪几个阶段? 应聘者: 线程的生命周期包含5个阶段,包括:新建、就绪、运行、阻塞、销毁。 新建:就是刚使用new方法,new出来的线程; 就绪:就是调用的线程的start()方法后,这时候线程处于等待CPU分配资源阶段,...
+关注继续查看

JAVA面试题 线程的生命周期包括哪几个阶段?
面试官:您知道线程的生命周期包括哪几个阶段?

应聘者:

线程的生命周期包含5个阶段,包括:新建、就绪、运行、阻塞、销毁。

新建:就是刚使用new方法,new出来的线程;

就绪:就是调用的线程的start()方法后,这时候线程处于等待CPU分配资源阶段,谁先抢的CPU资源,谁开始执行;

运行:当就绪的线程被调度并获得CPU资源时,便进入运行状态,run方法定义了线程的操作和功能;

阻塞:在运行状态的时候,可能因为某些原因导致运行状态的线程变成了阻塞状态,比如sleep()、wait()之后线程就处于了阻塞状态,这个时候需要其他机制将处于阻塞状态的线程唤醒,比如调用notify或者notifyAll()方法。唤醒的线程不会立刻执行run方法,它们要再次等待CPU分配资源进入运行状态;

销毁:如果线程正常执行完毕后或线程被提前强制性的终止或出现异常导致结束,那么线程就要被销毁,释放资源;

完整的生命周期图如下:

新建状态

我们来看下面一段代码:

1
Thread t1 = new Thread();
这里的创建,仅仅是在JAVA的这种编程语言层面被创建,而在操作系统层面,真正的线程还没有被创建。只有当我们调用了 start() 方法之后,该线程才会被创建出来,进入Runnable状态。只有当我们调用了 start() 方法之后,该线程才会被创建出来

就绪状态

调用start()方法后,JVM 进程会去创建一个新的线程,而此线程不会马上被 CPU 调度运行,进入Running状态,这里会有一个中间状态,就是Runnable状态,你可以理解为等待被 CPU 调度的状态

1
t1.start()
用一张图表示如下:

那么处于Runnable状态的线程能发生哪些状态转变?

Runnable状态的线程无法直接进入Blocked状态和Terminated状态的。只有处在Running状态的线程,换句话说,只有获得CPU调度执行权的线程才有资格进入Blocked状态和Terminated状态,Runnable状态的线程要么能被转换成Running状态,要么被意外终止。

运行状态

当CPU调度发生,并从任务队列中选中了某个Runnable线程时,该线程会进入Running执行状态,并且开始调用run()方法中逻辑代码。

那么处于Running状态的线程能发生哪些状态转变?

被转换成Terminated状态,比如调用 stop() 方法;

被转换成Blocked状态,比如调用了sleep, wait 方法被加入 waitSet 中;

被转换成Blocked状态,如进行 IO 阻塞操作,如查询数据库进入阻塞状态;

被转换成Blocked状态,比如获取某个锁的释放,而被加入该锁的阻塞队列中;

该线程的时间片用完,CPU 再次调度,进入Runnable状态;

线程主动调用 yield 方法,让出 CPU 资源,进入Runnable状态

阻塞状态

Blocked状态的线程能够发生哪些状态改变?

被转换成Terminated状态,比如调用 stop() 方法,或者是 JVM 意外 Crash;

被转换成Runnable状态,阻塞时间结束,比如读取到了数据库的数据后;

完成了指定时间的休眠,进入到Runnable状态;

正在wait中的线程,被其他线程调用notify/notifyAll方法唤醒,进入到Runnable状态;

线程获取到了想要的锁资源,进入Runnable状态;

线程在阻塞状态下被打断,如其他线程调用了interrupt方法,进入到Runnable状态;

终止状态

一旦线程进入了Terminated状态,就意味着这个线程生命的终结,哪些情况下,线程会进入到Terminated状态呢?

线程正常运行结束,生命周期结束;

线程运行过程中出现意外错误;

JVM 异常结束,所有的线程生命周期均被结束。

作者:Java蚂蚁

出处:https://www.cnblogs.com/marsitman/p/11228684.html

版权:转载请在文章明显位置注明作者及出处。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
SpringBoot整合Redis使用教程
Redis是现在最受欢迎的NoSQL数据库之一,Redis是一个使用ANSI C编写的开源、包含多种数据结构、支持网络、基于内存、可选持久性的键值对存储数据库,其具备如下特性:
6 0
SpringBoot缓存注解的使用
Spring从3.1版本开始定义了两个接口来统一不同的缓存从而帮助简化开发过程。它们分别是:org.springframework.cache.Cache和org.springframework.cache.CacheManager接口。
3 0
从 Spring 及 Mybatis 框架源码中学习设计模式
设计模式是解决问题的方案,从大神的代码中学习对设计模式的使用,可以有效提升个人编码及设计代码的能力。本系列博文用于总结阅读过的框架源码(Spring 系列、Mybatis)及 JDK 源码中 所使用过的设计模式,并结合个人工作经验,重新理解设计模式。
4 0
手撕源码!线程池核心组件源码剖析
看源码之前,先了解一下该组件 最主要的几个 接口、抽象类和实现类的结构关系。
6 0
给力!Java 并发之 Semaphore 源码剖析!
Semaphore 信号量,可用于控制一定时间内,并发执行的线程数,基于 AQS 实现。可应用于网关限流、资源限制 (如 最大可发起连接数)。由于 release() 释放许可时,未对释放许可数做限制,所以可以通过该方法增加总的许可数量。
5 0
这个开源库,快速生成全局唯一头像!
我给大家找了一个非常好用的开源库—— Generate Avatar。作者 Lorenz Weiß,是一名来自国外的 Web 开发者。
6 0
SpringBoot之Yaml学习
SpringBoot的配置文件除了支持application.properties文件格式还支持application.yaml格式的配置文件。
4 0
spring security技术分享(三)
用户认证就是判断一个用户的身份是否合法的过程,用户去访问系统资源时系统要求验证用户的身份信息,身份合法方可继续访问,不合法则拒绝访问。 认证是确认某主体在某系统中是否合法、可用的过程。这里的主体既可以是登录系统的用户,也可以是接入的设备或者其他系统。
3 0
SpringBoot实现文件上传接口
文件上传是很多业务场景需要实现的功能,今天就简单以Springboot框架为基础实现文件上传的接口。
1 0
+关注
推荐码发放
阿里云优惠码阿里云推荐券bieryun.com
381
文章
5
问答
文章排行榜
最热
最新
相关电子书
更多
OceanBase 入门到实战教程
立即下载
阿里云图数据库GDB,加速开启“图智”未来.ppt
立即下载
实时数仓Hologres技术实战一本通2.0版(下)
立即下载