首页 > 其他分享 >线程状态切换

线程状态切换

时间:2024-11-15 13:46:29浏览次数:1  
标签:状态 run 线程 切换 阻塞状态 就绪 运行

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()方法中进行处理,那么线程也会进入死亡状态。

标签:状态,run,线程,切换,阻塞状态,就绪,运行
From: https://www.cnblogs.com/89564f/p/18547829

相关文章

  • 国标GB28181软件LiteGBS国标GB28181-2022平台夜晚IPC灯光导致不能切换黑白模式且图像
    LiteGBS国标GB28181网页直播平台具有诸多显著特点。首先,它全力支持设备以GB28181协议接入,这意味着能够广泛接纳符合该协议标准的各类设备,为用户提供了丰富的设备选择空间。接入设备后,LiteGBS可对视频进行高效的解码、处理和分发等服务,确保视频信号的稳定传输和高质量呈现。在兼......
  • 线程状态切换
    Java线程控制方法的作用及其区别:start:作用:启动线程,由虚拟机自动调度执行run()方法。区别:线程处于就绪状态。run:作用:线程逻辑代码块处理,JVM调度执行。区别:线程处于运行状态。sleep:作用:让当前正在执行的线程休眠(暂停执行)。区别:不释放锁。wait:......
  • 实战指南:理解 ThreadLocal 原理并用于Java 多线程上下文管理
    目录一、ThreadLocal基本知识回顾分析(一)ThreadLocal原理(二)既然ThreadLocalMap的key是弱引用,GC之后key是否为null?(三)ThreadLocal中的内存泄漏问题及JDK处理方法(四)部分核心源码回顾ThreadLocal.set()方法源码详解ThreadLocalMap.get()方法详解ThreadLocal.remove()方法源......
  • python多线程和网络编程
    一、多线程1.进程、线程和并行执行学习目标:了解什么是进程、线程,了解什么是并行执行进程比作公司,线程比作员工,多线程并行执行就比作公司的不同员工在同一时间去做不同的事。总结2.多线程编程学习目标:掌握使用threading模块完成多线程编程当你想实现唱歌和跳舞一......
  • 分布式管理进阶:HarmonyOS Next 中的设备信息查询与状态监听
    本文旨在深入探讨华为鸿蒙HarmonyOSNext系统(截止目前API12)的技术细节,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。在探索HarmonyOSNext的分布式管理服务时......
  • Java核心知识体系10-线程管理
    Java系列Java核心知识体系1:泛型机制详解Java核心知识体系2:注解机制详解Java核心知识体系3:异常机制详解Java核心知识体系4:AOP原理和切面应用Java核心知识体系5:反射机制详解Java核心知识体系6:集合框架详解Java核心知识体系7:线程不安全分析Java核心知识体系8:Java如何保证线程......
  • 【JavaEE初阶 — 多线程】生产消费模型 & 阻塞队列
         1.阻塞队列     (1)阻塞队列   1.概念   阻塞队列是一种特殊的队列,也遵守"先进先出"的原则;阻塞队列能是一种线程安全的数据结构,主要用来阻塞队列的插入和获取操作:当队列满了的时候,插入操作会被阻塞,直到队列有空位。当队列为空的时......
  • Java面试之有三个线程T1,T2,T3,如何保证顺序执行?
    前言本来想着给自己放松一下,刷刷博客,突然被几道面试题难倒!有三个线程T1,T2,T3,如何保证顺序执行?似乎有点模糊了,那就大概看一下面试题吧。好记性不如烂键盘***12万字的java面试题整理***有三个线程T1,T2,T3,如何保证顺序执行?在多线程中有多种方法让线程按特定顺序执行,......
  • Java面试之多线程&并发篇(3)
    前言本来想着给自己放松一下,刷刷博客,突然被几道面试题难倒!SynchronizedMap和ConcurrentHashMap有什么区别?什么是线程安全?Thread类中的yield方法有什么作用?Java线程池中submit()和execute()方法有什么区别?似乎有点模糊了,那就大概看一下面试题吧。好记性不如烂键盘***12......
  • Java面试之多线程&并发篇(3)
    前言本来想着给自己放松一下,刷刷博客,突然被几道面试题难倒!SynchronizedMap和ConcurrentHashMap有什么区别?什么是线程安全?Thread类中的yield方法有什么作用?Java线程池中submit()和execute()方法有什么区别?似乎有点模糊了,那就大概看一下面试题吧。好记性不如烂键盘***12万字的j......