线程的状态转换和调度

server/2025/2/3 13:33:37/

  1. 新建状态New:新创建了一个线程对象

  2. 可运行状态Runnable:线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于可运行线程池中,变得可运行,等待获取CPU的使用权。

  3. 运行状态Running:可运行状态的线程获取了CPU资源时,执行程序run()方法代码。

  4. 阻塞状态Blocked:线程由于某种原因放弃CPU使用权,暂时停止运行。阻塞的情况分两种种:

    1. 同步阻塞:对象的同步锁被其他的线程占用时,则JVM会把该线程放入锁池中等待锁释放。

    2. 其他阻塞:当运行的线程执行sleep()join()方法,或发起I/O请求时,该线程将进入阻塞状态。在此期间,线程不会释放已持有的锁,一旦 sleep() 调用完成、join() 方法的等待线程终止或超时,或者 I/O 操作完成,线程将返回到可运行状态

  5. Waiting(等待状态): 运行的线程执行wait()方法,JVM会把该线程放入等待池中。需要被显式唤醒才能继续执行。

  6. Timed Waiting(含等待时间的等待状态): 线程进入等待状态,但指定了等待时间,超时后会被唤醒

  7. 终止状态(Terminated):线程正常完成了run() 方法执行流程 或 异常而提前退出时,该线程结束生命周期。

线程的调度
  1. 调整线程优先级:Java线程有优先级,且有继承关系(如A线程中创建B线程,AB优先级一样),优先级高的线程可能更先运行

static int MAX_PRIORITY线程可以具有的最高优先级,取值为10。
static int MIN_PRIORITY线程可以具有的最低优先级,取值为1。
static int NORM_PRIORITY分配给线程的默认优先级,取值为5。
  1. 线程睡眠:Thread.sleep(long millis)方法,使线程转到阻塞状态。millis参数设定睡眠的时间,以毫秒为单位。当睡眠结束后,就转为可运行状态 ,sleep() 方法的实现是平台无关的,可以在不同的操作系统上正常工作

  2. 线程等待:调用Object.wait()方法,释放了当前线程持有的对象锁,并将线程放入等待池中,直到其他线程调用此对象锁(Object)的notify()notifyAll()方法唤醒 等待池中的一个或多个对象

    • 如果多个线程都在等待同一个对象锁,则 notify() 方法只会唤醒其中一个线程,而 notifyAll() 则会唤醒所有等待中的线程,重新竞争该对象的锁

  3. 线程让步:调用Thread.yield()方法,让当前运行线程回到可运行状态,把执行机会让给自己,相同或者更高优先级的线程

  4. 线程加入:调用Thread.join()方法,可以让当前线程等待另一个线程的终止。即在当前线程中调用另一个线程的 join() 方法,当前线程将会进入阻塞状态,直到另一个线程运行结束,然后恢复到可运行状态

  5. 线程唤醒:调用 Object.notify() 方法,可以唤醒一个在该对象上等待的线程。如果多个线程都在等待同一个监视器,则 notify() 方法会随机选择一个线程来唤醒。。而 notifyAll() 方法则会唤醒所有在该对象监视器上等待的线程,被唤醒的线程需要重新竞争对象锁才能继续执行。

例子说明

注意点

  • wait,notify和 notifyAll 只能在同步锁方法或者同步控制块里面使用,而sleep可以在任何地方使用

  • 当线程离开一个同步块后,会自动释放该同步块持有的锁,这是Java规范

//wait用法
public class MyThreadPrinter2 implements Runnable {   private String name;   private Object prev;   private Object self;   private MyThreadPrinter2(String name, Object prev, Object self) {this.name = name; this.prev = prev;this.self = self;}   
​@Override  public void run() {   int count = 10;   while (count > 0) {   synchronized (prev) {     //先持有前一个线程所持有的对象锁前提下 synchronized (self) {      //持有自身对象锁      System.out.print(name);   count--;           self.notify();   //唤醒一个在当前对象上等待的线程  }   //自动释放self锁try {   prev.wait();     //释放prev对象锁,终止该锁上的当前线程} catch (InterruptedException e) {   e.printStackTrace();   }   }   }     public static void main(String[] args) throws Exception {   Object a = new Object();   Object b = new Object();   Object c = new Object();   MyThreadPrinter2 pa = new MyThreadPrinter2("A", c, a);  MyThreadPrinter2 pb = new MyThreadPrinter2("B", a, b);  MyThreadPrinter2 pc = new MyThreadPrinter2("C", b, c);         //整体过程//A线程最先运行,持有c,a对象锁-->唤醒B-->释放a锁-->释放c锁//线程B持有a,b锁,执行同步代码块后-->唤醒C-->释放b锁-->释放a锁//线程C持有b,c锁,执行同步代码块后-->唤醒A-->释放c锁-->释放b锁new Thread(pa).start();Thread.sleep(100);       //确保按顺序A、B、C执行new Thread(pb).start();Thread.sleep(100);  new Thread(pc).start();   Thread.sleep(100);  }   
}  
//输出结果:
//ABCABCABCABCABCABCABCABCABCABC


http://www.ppmy.cn/server/164623.html

相关文章

【JavaEE】Spring(7):统一功能处理

一、拦截器 拦截器的使用步骤: 定义拦截器注册配置拦截器 1. 定义拦截器 Slf4j Component public class LoginInterceptor implements HandlerInterceptor {Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Objec…

基于微信小程序的辅助教学系统的设计与实现

标题:基于微信小程序的辅助教学系统的设计与实现 内容:1.摘要 摘要:随着移动互联网的普及和微信小程序的兴起,基于微信小程序的辅助教学系统成为了教育领域的一个新的研究热点。本文旨在设计和实现一个基于微信小程序的辅助教学系统,以提高教…

CTFSHOW-WEB入门-命令执行54-70

题目&#xff1a;web 54 题目&#xff1a;解题思路&#xff1a;分析题目可以知道&#xff0c;题目过滤了&#xff1a; 分号&#xff1b;空格 数字 制表符 百分号% 反引号 大于号> 小于号< 中间若干个命令过滤方式&#xff0c;以cat为例&#xff1a; 这些字符 ‘c’、‘a…

【Redis】set 和 zset 类型的介绍和常用命令

1. set 1.1 介绍 set 类型和 list 不同的是&#xff0c;存储的元素是无序的&#xff0c;并且元素不允许重复&#xff0c;Redis 除了支持集合内的增删查改操作&#xff0c;还支持多个集合取交集&#xff0c;并集&#xff0c;差集 1.2 常用命令 命令 介绍 时间复杂度 sadd …

RTOS面试合集

目录 啥是RTOS 进程的状态 RTOS的调度 什么是时间片轮转调度&#xff1f; 如何实现基于优先级的抢占调度&#xff1f; 任务调度中的“时间窗”概念是什么&#xff1f; 任务和线程 如何在RTOS中创建和删除任务&#xff1f; 任务间如何共享数据&#xff1f; 如何管理任务…

01.双Android容器解决方案

目录 写在前面 一&#xff0c;容器 1.1 容器的原理 1.1.1 Namespace 1.1.2 Cgroups&#xff08;Control Groups&#xff09; 1.1.3 联合文件系统&#xff08;Union File System&#xff09; 1.2 容器的应用 1.2.1 微服务架构 1.2.2 持续集成和持续部署&#xff08;CI/…

2015年蓝桥杯第六届CC++大学B组真题及代码

目录 1A&#xff1a;奖券数目&#xff08;填空_简单枚举&#xff09; 2B&#xff1a;星系炸弹&#xff08;填空_日期计算&#xff09; 3C&#xff1a;三羊献瑞&#xff08;填空_全排列&#xff09; 4D&#xff1a;格子中输出&#xff08;代码填空&#xff09; 5E&#xff1…

代替Winform、Win32控件的一些界面框架Electron,QT等

以下是一些可以代替Winform、Win32控件&#xff0c;在VC、VBA等EXE程序上用来做控件元素、表格数据绑定、窗口显示的WEB UI框架和工具&#xff1a; 1. Electron 特点&#xff1a;Electron是一个使用JavaScript、HTML和CSS构建跨平台桌面应用程序的框架。它允许开发者使用Web技…