线程状态切换

news/2024/11/15 13:56:48/文章来源:https://www.cnblogs.com/2324hh/p/18547822

Java线程控制方法的作用及其区别:

  1. start:
    • 作用:启动线程,由虚拟机自动调度执行run()方法。
    • 区别:线程处于就绪状态。
  1. run:
    • 作用:线程逻辑代码块处理,JVM调度执行。
    • 区别:线程处于运行状态。
  1. sleep:
    • 作用:让当前正在执行的线程休眠(暂停执行)。
    • 区别:不释放锁。
  1. wait:
    • 作用:使得当前线程等待。
    • 区别:释放同步锁。
  1. notify:
    • 作用:唤醒在此对象监视器上等待的单个线程。
    • 区别:唤醒单个线程。
  1. notifyAll:
    • 作用:唤醒在此对象监视器上等待的所有线程。
    • 区别:唤醒多个线程。
  1. yield:
    • 作用:停止当前线程,让同等优先权的线程运行。
    • 区别:用Thread类调用。
  1. join:
    • 作用:使当前线程停下来等待,直至另一个调用join方法的线程终止。
    • 区别:用线程对象调用。

总结:

  • startrun 方法用于启动和执行线程,但它们的区别在于线程的状态不同。
  • sleep, wait, notify, notifyAll, yield, 和 join 等方法则用于控制线程的执行顺序和状态,包括暂停、等待、唤醒和其他线程交互操作。

 

  1. 从创建到就绪状态
public class ThreadExample {public static void main(String[] args) {Thread myThread = new MyThread();myThread.start();// 调用start方法,线程从创建变为就绪}
}
class MyThread extends Thread {public void run() {System.out.println("线程正在运行");}
}
    • 当调用线程对象的start()方法时,线程就从创建状态转换为就绪状态。这是线程生命周期中的第一次状态转换。例如,在Java中:
    • 这里myThreadnew之后处于创建状态,当执行start()方法后就进入就绪状态,等待CPU分配时间片来执行run()方法中的内容。
  1. 从就绪到运行状态
    • 当CPU的调度器决定将CPU时间片分配给某个就绪状态的线程时,该线程就从就绪状态转换为运行状态。这个过程是由操作系统的线程调度算法控制的。
    • 例如,在一个多线程环境中,假设有线程A、B、C都处于就绪状态。操作系统的调度算法(如时间片轮转、优先级调度等)会根据一定的规则选择一个线程,比如选择了线程A,那么线程A就从就绪状态转换为运行状态,开始执行它的run()方法中的代码。
  1. 从运行到就绪状态
    • 当正在运行的线程的时间片用完,或者有更高优先级的线程进入就绪状态并抢占CPU时,当前运行的线程就会从运行状态转换为就绪状态。
    • 例如,采用时间片轮转调度算法,假设一个线程的时间片是10ms,当这个线程运行了10ms后,CPU会暂停该线程的执行,将其放回就绪队列,等待下一次分配时间片。再比如,一个低优先级的线程正在运行,突然有一个高优先级的线程进入就绪状态,操作系统可能会暂停低优先级线程的运行,将其转换为就绪状态,而让高优先级线程开始运行。
  1. 从运行到阻塞状态
    • 当线程在运行过程中遇到某些阻塞事件时,会从运行状态转换为阻塞状态。如前所述,常见的阻塞事件包括等待I/O操作完成和等待获取锁。
    • 例如,一个线程在运行时需要从文件中读取数据,当它调用文件读取操作(如BufferedReader.readLine()方法)后,由于文件读取操作可能需要一些时间(取决于文件系统、网络等因素),线程就会进入阻塞状态,等待数据读取完成。或者当多个线程竞争一个对象锁时,一个线程在运行中尝试获取被其他线程占用的锁,就会进入阻塞状态,直到锁被释放。
  1. 从阻塞到就绪状态
    • 当导致线程阻塞的事件结束后,线程会从阻塞状态转换为就绪状态。例如,当线程等待的I/O操作完成后,或者线程成功获取到之前等待的锁时,它就会从阻塞状态转换为就绪状态。
    • 比如,前面提到的读取文件数据的线程,当文件数据读取完成后,线程就会从阻塞状态转换为就绪状态,等待CPU分配时间片再次运行。对于等待锁的线程,当占用锁的线程释放锁后,等待的线程就会从阻塞状态转换为就绪状态。
  1. 从运行到死亡状态
    • 当线程正常执行完run()方法中的所有代码或者因为未捕获的异常而退出run()方法时,线程就从运行状态转换为死亡状态。
    • 例如,一个线程的任务是计算1到10的和,在run()方法中通过循环完成计算后,run()方法执行完毕,线程就进入死亡状态。如果线程在运行过程中抛出一个未捕获的异常,如NullPointerException,并且没有在run()方法中进行处理,那么线程也会进入死亡状态。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/834016.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI智能检测视频分析网关安全帽检测识别监控解决方案

在当代建筑行业中,保障工人的安全始终是最为紧迫的议题。事故如高空坠落和物体撞击等频繁发生,严重威胁着工人的生命安全。安全帽作为一项基础的个人防护设备,其正确使用对于减轻事故伤害起着至关重要的作用。 不过,依赖传统的人工检查方法不仅效率不高,还可能存在疏漏和错…

制造企业的数字化转型:五款优秀项目管理软件推荐

制造业的生产管理往往涉及复杂的流程和多部门协作,如何确保各环节顺利对接、信息准确传递,是每一家制造企业都在不断优化的问题。面对这些管理难题,越来越多的制造企业引入了项目管理软件,通过直观的任务分配、进度跟踪、数据反馈等功能,极大地提升了生产效率和团队协作质…

React Router 的实现原理

本文分两部分,一说前端路由的基本原理,二说 React Router 的实现原理 前端路由的基本原理​ 不说屁话,从时间线上讲,Web 应用原本是后端渲染,后来随着技术的发展,有了单页面应用,慢慢从后端渲染发展成前端渲染 在博客前端路由hash、history的实现 一问中我已经介绍过这两…

[TJOI2007] 路标设置

[[TJOI2007] 路标设置(https://www.luogu.com.cn/problem/P3853) 题目 B 市和 T 市之间有一条长长的高速公路,公路上相邻路标的最大距离定义为该公路的“空旷指数”。现在公路上增设一些路标,使得公路的“空旷指数”最小。请设计一个程序计算能达到的最小值是多少。请注意,公…

TBM810-ASEMI贴片桥堆8A 1000V

TBM810-ASEMI贴片桥堆8A 1000V编辑:ll TBM810-ASEMI贴片桥堆8A 1000V 型号:TBM810 品牌:ASEMI 封装:TBM-4 特性:贴片桥堆 正向电流:8A 反向耐压:1000V 恢复时间:>2000ns 引脚数量:4 芯片个数:4 芯片尺寸:50MIL 浪涌电流:50A 漏电流:>10uA 工作温度:-55℃~150…

Python开发环境搭建(PyCharm+Anaconda+Git+Gitee)

一、Anaconda介绍 1.1 为什么选择Anaconda? Anaconda是一个开源的Python发行版本,主要用于数据科学和机器学习,它包含了Python、conda以及众多工具和库,让我们可以轻松的构建和管理python虚拟环境,方便的进行python项目开发。下面是选择Anaconda的理由:安装简单方便 便捷…

Visual Studio 快速分析 .NET Dump 文件

前言 在开发和维护 .NET 应用程序的过程中,有时会遇到难以捉摸的性能瓶颈或内存泄漏等问题。这些问题往往发生在生产环境中,难以复现。为了更准确地诊断这些运行时问题,通常会收集应用程序在生产环境中的内存转储文件(.dump 文件)。在这种情况下,分析内存转储文件(.dump…

使用model-viewer加载glb文件

实现效果代码 react项目引入方式可选其一1.在html中引入 <script type="module" src="https://unpkg.com/@google/model-viewer/dist/model-viewer.min.js"></script>npm 或者 yarn安装yarn add @google/model-viewerindex.jsimport React, { …

关于定时器周期、频率等相关计算

1、定时器作为计数器,时钟频率计算如下图: 2、定时器产生一次更新中断时间计算,如下: 当定时器设置为边沿对齐模式和向上计数模式时,定时器计数到重装载值(arr)产生一次中断,产生一次中断的时间为: 其中:T为定时器周期,也为此处产生一次中断的时间;arr为重装载值…

useCallback 和 useMemo 使用场景

一切为了性能,无论是 useCallback 还是 useMemo 还是 memo,都是为了让不该渲染的组件不去渲染 在学习 useCallback、useMemo 之前,我们需要知道一点,React 的渲染是自顶而下,如果父组件渲染了,那么子组件也会渲染,其子孙组件“世世代代”都要渲染 但如果父组件的渲染与子…

[LeetCode 最大岛屿面积

### DFS解法``` python class Solution:dir = [(-1,0),(1,0),(0,-1),(0,1)]def dfs(self,grid,x,DFS解法 class Solution:dir = [(-1,0),(1,0),(0,-1),(0,1)]def dfs(self,grid,x,y):if x < 0 or x >= len(grid) or y < 0 or y >= len(grid[0]) or grid[x][y] != 1…

【Ubuntu】在Ubuntu上安装微信

【Ubuntu】在Ubuntu上安装微信 零、说明 微信官网最近发布了Linux的测试版本,实际使用下来与Windows版本相差不多,本文介绍如何在Ubuntu(Debian系)上安装Linux版本的微信。 壹、下载 打开Linux微信官网:https://linux.weixin.qq.com/,根据自己的处理器架构选择对应的deb格…