java学习之高级语法(十七)----- 线程状态

简介: java学习之高级语法(十七)----- 线程状态

 ▶  线程状态概述

当线程被创建并启动后,它既不是一启动就进入了执行状态,也不是一直处于执行状态。

在线程的生命周期中存在6种线程状态 ,在API中 java.lang.Thread.State 这个枚举中给出了六种线程状态。

image.gif编辑

下面这张图展示了线程的6个状态:

image.gif编辑

不需要去研究这6种状态的实现原理,只需要知道在做线程操作中存在这样的状态。

▶ Timed Waiting( 计时等待 )

Timed Waiting 在API中的描述为:一个正在限时等待另一个线程执行一个动作的线程处于这一状态。

之前学到过调用 sleep 方法就可以使当前执行的进程进入到 “ 休眠状态 ”,这其实就是所谓的 Timed Waiting

---  sleep 方法的使用需要注意以下几点:

(1)进入 Timed Waiting 状态的一种常见情形是调用 sleep 方法,单独的线程也可以调用,不一定非要有协作关系

(2)为了让其他线程有机会执行,可以将Thread.sleep()的调用放在线程run()之内,这样才能保证该线程执行过程中会睡眠

(3)sleep与锁无关,线程睡眠到期会自动苏醒

提示:sleep() 中指定的时间是线程不会运行的最短时间,因此,sleep()方法不能保证该线程睡眠到期后就立刻开始执行  

---  进入TimeWaiting(计时等待)有两种方式:

(1)使用sleep(long m)方法在毫秒值结束之后,线程睡醒进入到Runnable / Blocked状态

(2)使用wait(long m)方法,wait方法如果在毫秒值结束之后,还没有被notify唤醒,就会自动醒来,线程睡醒进入到Runnable / Blocked 状态

---  唤醒的方法:

(1)void notify() 唤醒在此对象监视器上等待的单个线程

(2)void notifyAll() 唤醒在此对象监视器上等待的所有线程

Timed Waiting 的线程状态图:

image.gif编辑

▶  BLOCKED( 锁阻塞 )

Blocked状态在API中的介绍为:一个正在阻塞等待一个监视器锁(锁对象)的线程处于这一状态。

例如:线程A和线程B代码使用同一锁,如果线程A获取到锁,线程A进入到Runnable 状态,那么线程B就进入到 Blocked 锁阻塞状态。这是由 Runnable 状态进入 Blocked 状态。除此 Waiting 以及Time Waiting状态也会在某种情况下进入阻塞状态。

image.gif编辑

▶  Waiting(无限等待)

Waiting状态在API中介绍为:一个正在无限期等待另一个线程执行一个特别的(唤醒)动作的线程处于这一状态。

一个调用了某个对象的 Object.wait 方法的线程会等待另一个线程调用此对象的 Object.notify() 方法或Object.notifyAll()方法。

其实 waiting 状态并不是一个线程的操作,它体现的是多个线程间的通信,可以理解为多个线程之间的协作关系,多个线程会争取锁,同时相互之间又存在协作关系。( 会有竞争但更多的时候是协作 )

waiting线程状态图:

image.gif编辑

image.gif编辑

image.gif编辑

image.gif编辑

▶  补充

image.gif编辑


相关文章
|
7天前
|
存储 缓存 安全
【Java面试题汇总】多线程、JUC、锁篇(2023版)
线程和进程的区别、CAS的ABA问题、AQS、哪些地方使用了CAS、怎么保证线程安全、线程同步方式、synchronized的用法及原理、Lock、volatile、线程的六个状态、ThreadLocal、线程通信方式、创建方式、两种创建线程池的方法、线程池设置合适的线程数、线程安全的集合?ConcurrentHashMap、JUC
【Java面试题汇总】多线程、JUC、锁篇(2023版)
|
4天前
|
设计模式 架构师 Java
Java开发工程师转架构师需要学习什么
Java开发工程师转型为架构师需掌握多项技能:精通Java及框架、数据库与分布式系统;熟悉设计模式与架构模式;积累项目经验;提升沟通与领导力;持续学习新技术;培养系统设计与抽象能力;了解中间件及开发工具;并注重个人特质与职业发展。具体路径应结合个人目标与实际情况制定。
34 18
|
1天前
|
缓存 Java 应用服务中间件
Java虚拟线程探究与性能解析
本文主要介绍了阿里云在Java-虚拟-线程任务中的新进展和技术细节。
|
3天前
|
Java
深入理解Java中的多线程编程
本文将探讨Java多线程编程的核心概念和技术,包括线程的创建与管理、同步机制以及并发工具类的应用。我们将通过实例分析,帮助读者更好地理解和应用Java多线程编程,提高程序的性能和响应能力。
16 4
|
11天前
|
Java 调度 开发者
Java并发编程:深入理解线程池
在Java的世界中,线程池是提升应用性能、实现高效并发处理的关键工具。本文将深入浅出地介绍线程池的核心概念、工作原理以及如何在实际应用中有效利用线程池来优化资源管理和任务调度。通过本文的学习,读者能够掌握线程池的基本使用技巧,并理解其背后的设计哲学。
|
2天前
|
安全 Java 调度
Java 并发编程中的线程安全和性能优化
本文将深入探讨Java并发编程中的关键概念,包括线程安全、同步机制以及性能优化。我们将从基础入手,逐步解析高级技术,并通过实例展示如何在实际开发中应用这些知识。阅读完本文后,读者将对如何在多线程环境中编写高效且安全的Java代码有一个全面的了解。
|
11天前
|
缓存 监控 Java
Java中的并发编程:理解并应用线程池
在Java的并发编程中,线程池是提高应用程序性能的关键工具。本文将深入探讨如何有效利用线程池来管理资源、提升效率和简化代码结构。我们将从基础概念出发,逐步介绍线程池的配置、使用场景以及最佳实践,帮助开发者更好地掌握并发编程的核心技巧。
|
7天前
|
Java 调度 开发者
Java中的多线程基础及其应用
【9月更文挑战第13天】本文将深入探讨Java中的多线程概念,从基本理论到实际应用,带你一步步了解如何有效使用多线程来提升程序的性能。我们将通过实际代码示例,展示如何在Java中创建和管理线程,以及如何利用线程池优化资源管理。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的见解和技巧,帮助你更好地理解和应用多线程编程。
|
12天前
|
算法 Java 数据处理
Java并发编程:解锁多线程的力量
在Java的世界里,掌握并发编程是提升应用性能和响应能力的关键。本文将深入浅出地探讨如何利用Java的多线程特性来优化程序执行效率,从基础的线程创建到高级的并发工具类使用,带领读者一步步解锁Java并发编程的奥秘。你将学习到如何避免常见的并发陷阱,并实际应用这些知识来解决现实世界的问题。让我们一起开启高效编码的旅程吧!
|
11天前
|
安全 Java UED
Java并发编程:解锁多线程的潜力
在Java的世界里,并发编程如同一场精心编排的交响乐,每个线程扮演着不同的乐手,共同奏响性能与效率的和声。本文将引导你走进Java并发编程的大门,探索如何在多核处理器上优雅地舞动多线程,从而提升应用的性能和响应性。我们将从基础概念出发,逐步深入到高级技巧,让你的代码在并行处理的海洋中乘风破浪。