谈谈你对Java线程5种状态流转原理的理解?

简介: 今天,有位工作5年的小伙伴被问到这样一道面试题,说谈谈你对Java线程5种状态流转原理的理解。当时,平时只关注过线程如何定义和使用,对于线程状态流转脑海一片空白,完全懵了。于是找到我,希望我拍一期视频。今天,我给大家分享一下我的理解。

今天,有位工作5年的小伙伴被问到这样一道面试题,说谈谈你对Java线程5种状态流转原理的理解。当时,平时只关注过线程如何定义和使用,对于线程状态流转脑海一片空白,完全懵了。于是找到我,希望我拍一期视频。


今天,我给大家分享一下我的理解。

1、线程定义

回答线程流转原理这个问题之前,我们先来回忆一下JDK中3种自定义线程的方式以及它们的优缺点。

0d4d4460963ba72bc63e9e9ac25c172f.jpg

第1种:是继承Thread类。如代码所示:

public class MyThread extends Thread{
public void run(){
// to do something
}
}

这种方式的优点是:实现简单,只需实例化继承类的实例,即可使用线程。


它的缺点是:扩展性不足,Java是单继承的语言,如果一个类已经继承了其他类,就无法通过这种方式实现自定义线程

d0ccb5f767aea8bd96971734254713da.jpg

第2种:是实现 Runnable 接口,如代码所示:

public class MyThread implements Runable{
public void run(){
// to do something
}
}

它的优点是:扩展性好,可以在此基础上继承其他类,非常适合多线程处理一份资源的场景


它的缺点是:构造线程实例的过程相对繁琐一点

71297b80255445e30aeabb09c6d97d38.jpg

第3种:是实现Callable接口,如代码所示:

public class MyThread implements Callable<String>{
public String call() throws Exception{
// to do something
return null;
}
}

它的优点是:扩展性好,能支持回调并得到返回值,而且可以抛出受检查异常。


它的缺点是:相较于实现Runnable接口的方式,调用过程较为繁琐。

2、线程状态流转原理

首先来看这样一张图,它涵盖了Java 中多线程各重要知识点。如果掌握了此图,Java 中的多线程也就基本上掌握了。

51cc95afffcdcfcf54fdf1fc00ad1aca.jpg

从图中可以看出,线程状态的流转,一共包括以下 5 种情形:

c137b2bdbaa2f3a5bfc4de21299987df.jpg

1. 新建状态(New): 线程对象创建后,就进入了新建状态。例如,Thread thread = new Thread()。

5622c52d484f052e832b1e0920e1868a.jpg

b450a2486cbf49a7d0152708d7df14fa.jpg

2. 就绪状态(Runnable): 也被称为“可执行状态”。线程对象被创建后,其它线程调用了线程的start()方法,从而来启动该线程。这个时候,线程处于就绪状态,它随时可能被CPU调度执行。

7644f93fd4e21df9ba45ad73c064644e.jpg

72bdc75af64b3f60bdf9c03453266b8b.jpg

3. 运行状态(Running): 是指线程获取CPU资源后,正在运行。需要注意的是,线程只能从就绪状态进入到运行状态。

e1d49bd264815a1853402e97b1bcbd67.jpg

471d47aeac2413aa7341e369f65ae44e.jpg

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


那么,阻塞又分为三种情况:


1) 等待阻塞,指通过调用线程的wait()方法,让线程等待。


2) 同步阻塞 ,指线程在获取synchronized同步锁时,因为锁被其它线程所占用而导致获取失败,会进入同步阻塞状态。


3) 其他阻塞,是指通过调用线程的sleep()方法 或者 join()方法 又或者 发出了I/O请求的时候,线程会进入到阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。

9434de82e23e6fb8946df939e714390a.jpg

977bbb50677959e16c99f7b504a4a0fe.jpg

5. 死亡状态(Dead): 是指线程执行完毕或者因异常退出了run()方法,线程结束生命周期。

906eb37725b830a287b895cf8f934864.jpg

75fc5d32a1a42004eff7c839ecc63c35.jpg

举个通俗一点的例子来解释上面五种状态,比如我们平时去商场上厕所,准备去上厕所就是新建状态(new),上厕所要排队,排队就是就绪状态(Runnable),有坑位了,轮到你了,蹲坑就是运行状态(Running),蹲完坑发现没有手纸,需要等待其他人送纸过来,这个状态就是阻塞(Blocked),等上完厕所出来,上厕所这件事情结束了线程也就不存在了,就是死亡状态。


需要注意的是:便秘也是阻塞状态,你便秘太久,其他人会等不及,可能会把你赶走,这个就是挂起。还有一种情况就是,如果你便秘占坑位太久,其他人跟你说,先出去酝酿一下,5分钟后再过来蹲坑,这就叫睡眠。


好了,以上就是我对线程状态流转原理的理解。


我是被编程耽误的文艺Tom,关注我,面试不再难!

b47a6e98314749488df58a0cfbc33b50.gif

相关文章
|
4天前
|
设计模式 安全 Java
【JAVA】Java 中什么叫单例设计模式?请用 Java 写出线程安全的单例模式
【JAVA】Java 中什么叫单例设计模式?请用 Java 写出线程安全的单例模式
|
1天前
|
存储 安全 Java
【Java EE】CAS原理和实现以及JUC中常见的类的使用
【Java EE】CAS原理和实现以及JUC中常见的类的使用
|
1天前
|
消息中间件 监控 安全
【JAVAEE学习】探究Java中多线程的使用和重点及考点
【JAVAEE学习】探究Java中多线程的使用和重点及考点
|
1天前
|
安全 Java 开发者
构建高效微服务架构:后端开发的新范式Java中的多线程并发编程实践
【4月更文挑战第29天】在数字化转型的浪潮中,微服务架构已成为软件开发的一大趋势。它通过解耦复杂系统、提升可伸缩性和促进敏捷开发来满足现代企业不断变化的业务需求。本文将深入探讨微服务的核心概念、设计原则以及如何利用最新的后端技术栈构建和部署高效的微服务架构。我们将分析微服务带来的挑战,包括服务治理、数据一致性和网络延迟问题,并讨论相应的解决方案。通过实际案例分析和最佳实践的分享,旨在为后端开发者提供一套实施微服务的全面指导。 【4月更文挑战第29天】在现代软件开发中,多线程技术是提高程序性能和响应能力的重要手段。本文通过介绍Java语言的多线程机制,探讨了如何有效地实现线程同步和通信,以及如
|
3天前
|
设计模式 消息中间件 Java
Java 设计模式:探索发布-订阅模式的原理与应用
【4月更文挑战第27天】发布-订阅模式是一种消息传递范式,被广泛用于构建松散耦合的系统。在 Java 中,这种模式允许多个对象监听和响应感兴趣的事件。
20 2
|
4天前
|
安全 Java
【JAVA】线程的run()和start()有什么区别?
【JAVA】线程的run()和start()有什么区别?
|
5天前
|
缓存 Java
Java并发编程:深入理解线程池
【4月更文挑战第26天】在Java中,线程池是一种重要的并发工具,它可以有效地管理和控制线程的执行。本文将深入探讨线程池的工作原理,以及如何使用Java的Executor框架来创建和管理线程池。我们将看到线程池如何提高性能,减少资源消耗,并提供更好的线程管理。
|
5天前
|
Java UED
Java并发编程:理解并应用线程池
【4月更文挑战第25天】在处理并发问题时,线程池是Java中一种重要的工具。本文将探讨线程池的概念、优势以及如何在Java程序中有效地使用它。我们将详细解释线程池的工作原理,并通过示例来使其更加易于理解。
|
5天前
|
监控 Java 调度
Java多线程实战-从零手搓一个简易线程池(四)线程池生命周期状态流转实现
Java多线程实战-从零手搓一个简易线程池(四)线程池生命周期状态流转实现
|
5天前
|
设计模式 Java
Java多线程实战-从零手搓一个简易线程池(三)线程工厂,核心线程与非核心线程逻辑实现
Java多线程实战-从零手搓一个简易线程池(三)线程工厂,核心线程与非核心线程逻辑实现