# Java多线程实战课堂师生线程交互案例博客 ## 一、前言 在Java开发中**多线程**是核心知识点而线程休眠sleep与线程中断interrupt是线程通信、线程调度最常用的组合。本文仿照示例代码思路实现**学生1、学生2、老师**三个线程协同工作的场景模拟课堂上老师讲课、学生睡觉、相互唤醒的完整逻辑同时附上完整代码、执行流程、运行结果与代码解析新手也能轻松看懂。 ## 二、需求分析 1. 一共创建3个线程student1学生1、student2学生2、teacher老师。 2. 程序启动后两名学生进入休眠状态模拟上课睡觉。 3. 老师连续三次输出“上课”模拟讲课提醒。 4. 老师讲课结束后**中断唤醒学生1**。 5. 学生1被唤醒后继续**中断唤醒学生2**。 6. 利用Thread.sleep()实现线程休眠interrupt()实现线程中断唤醒。 ## 三、完整代码实现 项目分为两个Java文件主启动类 Example15_12.java、线程任务类 ClassRoom.java代码附带详细注释。 ### 1. 线程任务类 ClassRoom.java 该类实现 Runnable 接口统一作为三个线程的执行任务在run()方法中区分不同线程的业务逻辑。 java /** * 教室线程任务类实现Runnable承载老师、两名学生三个线程的逻辑 */ public class ClassRoom implements Runnable { // 定义三个线程对象 Thread student1, student2, teacher; // 构造方法初始化线程、设置线程名称 public ClassRoom() { teacher new Thread(this); student1 new Thread(this); student2 new Thread(this); // 给线程命名方便区分输出 teacher.setName(雷老师); student1.setName(学生1); student2.setName(学生2); } // 线程核心执行方法 Override public void run() { // 判断当前正在运行的线程执行对应逻辑 if (Thread.currentThread() student1) { try { System.out.println(student1.getName() 正在睡觉不听课); // 休眠10秒测试用原逻辑为10分钟 Thread.sleep(10 * 1000); } catch (InterruptedException e) { // 线程被中断时触发异常 System.out.println(student1.getName() 被老师叫醒了); } System.out.println(student1.getName() 开始听课); // 学生1被唤醒后主动唤醒学生2 student2.interrupt(); } else if (Thread.currentThread() student2) { try { System.out.println(student2.getName() 正在睡觉不听课); // 休眠60秒测试用原逻辑为1小时 Thread.sleep(60 * 1000); } catch (InterruptedException e) { System.out.println(student2.getName() 被学生1叫醒了); } System.out.println(student2.getName() 开始听课); } else if (Thread.currentThread() teacher) { // 老师连续输出3次上课提醒 for (int i 1; i 3; i) { System.out.println(上课); try { // 每次输出间隔0.5秒 Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } } // 老师讲课完毕唤醒学生1 student1.interrupt(); } } } ### 2. 主启动类 Example15_12.java 程序入口创建教室对象并启动三个线程。 java /** * 程序主类入口函数启动所有线程 */ public class Example15_12 { public static void main(String[] args) { // 创建教室任务对象 ClassRoom room new ClassRoom(); // 依次启动三个线程 room.student1.start(); room.student2.start(); room.teacher.start(); } } ## 四、核心知识点讲解 ### 1. Runnable 接口 本案例采用**实现Runnable接口**的方式创建多线程优势是多个线程可以共享同一个任务对象代码复用性更强也是企业开发主流写法。 ### 2. Thread.sleep(long ms) - 作用让当前线程进入**阻塞休眠状态**单位为毫秒。 - 特点休眠期间线程不会抢夺CPU资源该方法会抛出受检异常 InterruptedException必须手动捕获。 ### 3. Thread.interrupt() 线程中断 - 作用**唤醒处于sleep、wait状态的线程**并不会直接终止线程。 - 原理当线程执行sleep()时被调用interrupt()会立即抛出InterruptedException跳出休眠状态继续执行后续代码。 ### 4. Thread.currentThread() 静态方法用于**获取当前正在执行的线程对象**本案例依靠该方法区分老师、学生线程执行不同业务。 ## 五、程序执行流程 1. **初始化阶段**main方法创建ClassRoom对象初始化student1、student2、teacher三个线程并命名。 2. **线程启动**调用start()启动三个线程并发执行run()方法。 3. **初始状态** - 学生1打印睡觉提示进入10秒休眠。 - 学生2打印睡觉提示进入60秒休眠。 - 老师循环3次打印“上课”每次间隔0.5秒。 4. **第一次唤醒**老师完成3次输出后调用student1.interrupt()学生1休眠被打断输出唤醒提示随后唤醒学生2。 5. **第二次唤醒**学生2休眠被打断输出唤醒提示最后开始听课所有线程执行完毕。 ## 六、运行结果 说明线程启动顺序存在微小随机性前两行学生输出顺序可能互换不影响整体逻辑。 学生1正在睡觉不听课 学生2正在睡觉不听课 上课 上课 上课 学生1被老师叫醒了 学生1开始听课 学生2被学生1叫醒了 学生2开始听课 ## 七、拓展与总结 1. **时间修改**如果需要还原原题原始时长只需修改sleep参数 - 学生1Thread.sleep(10 * 60 * 1000);10分钟 - 学生2Thread.sleep(60 * 60 * 1000);1小时 2. **核心逻辑总结** - 多线程共享任务统一实现Runnable通过线程对象区分业务。 - 休眠中断组合sleep阻塞线程interrupt唤醒线程是线程简易通信的经典用法。 3. **场景延伸**该思路可拓展到生产者-消费者、定时任务、排队唤醒等多线程业务场景。 本案例简单直观非常适合巩固Java基础多线程知识大家可以自行修改线程名称、休眠时长、输出内容加深练习。
Java 多线程实战:课堂师生线程交互案例博客
发布时间:2026/6/12 2:16:05
# Java多线程实战课堂师生线程交互案例博客 ## 一、前言 在Java开发中**多线程**是核心知识点而线程休眠sleep与线程中断interrupt是线程通信、线程调度最常用的组合。本文仿照示例代码思路实现**学生1、学生2、老师**三个线程协同工作的场景模拟课堂上老师讲课、学生睡觉、相互唤醒的完整逻辑同时附上完整代码、执行流程、运行结果与代码解析新手也能轻松看懂。 ## 二、需求分析 1. 一共创建3个线程student1学生1、student2学生2、teacher老师。 2. 程序启动后两名学生进入休眠状态模拟上课睡觉。 3. 老师连续三次输出“上课”模拟讲课提醒。 4. 老师讲课结束后**中断唤醒学生1**。 5. 学生1被唤醒后继续**中断唤醒学生2**。 6. 利用Thread.sleep()实现线程休眠interrupt()实现线程中断唤醒。 ## 三、完整代码实现 项目分为两个Java文件主启动类 Example15_12.java、线程任务类 ClassRoom.java代码附带详细注释。 ### 1. 线程任务类 ClassRoom.java 该类实现 Runnable 接口统一作为三个线程的执行任务在run()方法中区分不同线程的业务逻辑。 java /** * 教室线程任务类实现Runnable承载老师、两名学生三个线程的逻辑 */ public class ClassRoom implements Runnable { // 定义三个线程对象 Thread student1, student2, teacher; // 构造方法初始化线程、设置线程名称 public ClassRoom() { teacher new Thread(this); student1 new Thread(this); student2 new Thread(this); // 给线程命名方便区分输出 teacher.setName(雷老师); student1.setName(学生1); student2.setName(学生2); } // 线程核心执行方法 Override public void run() { // 判断当前正在运行的线程执行对应逻辑 if (Thread.currentThread() student1) { try { System.out.println(student1.getName() 正在睡觉不听课); // 休眠10秒测试用原逻辑为10分钟 Thread.sleep(10 * 1000); } catch (InterruptedException e) { // 线程被中断时触发异常 System.out.println(student1.getName() 被老师叫醒了); } System.out.println(student1.getName() 开始听课); // 学生1被唤醒后主动唤醒学生2 student2.interrupt(); } else if (Thread.currentThread() student2) { try { System.out.println(student2.getName() 正在睡觉不听课); // 休眠60秒测试用原逻辑为1小时 Thread.sleep(60 * 1000); } catch (InterruptedException e) { System.out.println(student2.getName() 被学生1叫醒了); } System.out.println(student2.getName() 开始听课); } else if (Thread.currentThread() teacher) { // 老师连续输出3次上课提醒 for (int i 1; i 3; i) { System.out.println(上课); try { // 每次输出间隔0.5秒 Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } } // 老师讲课完毕唤醒学生1 student1.interrupt(); } } } ### 2. 主启动类 Example15_12.java 程序入口创建教室对象并启动三个线程。 java /** * 程序主类入口函数启动所有线程 */ public class Example15_12 { public static void main(String[] args) { // 创建教室任务对象 ClassRoom room new ClassRoom(); // 依次启动三个线程 room.student1.start(); room.student2.start(); room.teacher.start(); } } ## 四、核心知识点讲解 ### 1. Runnable 接口 本案例采用**实现Runnable接口**的方式创建多线程优势是多个线程可以共享同一个任务对象代码复用性更强也是企业开发主流写法。 ### 2. Thread.sleep(long ms) - 作用让当前线程进入**阻塞休眠状态**单位为毫秒。 - 特点休眠期间线程不会抢夺CPU资源该方法会抛出受检异常 InterruptedException必须手动捕获。 ### 3. Thread.interrupt() 线程中断 - 作用**唤醒处于sleep、wait状态的线程**并不会直接终止线程。 - 原理当线程执行sleep()时被调用interrupt()会立即抛出InterruptedException跳出休眠状态继续执行后续代码。 ### 4. Thread.currentThread() 静态方法用于**获取当前正在执行的线程对象**本案例依靠该方法区分老师、学生线程执行不同业务。 ## 五、程序执行流程 1. **初始化阶段**main方法创建ClassRoom对象初始化student1、student2、teacher三个线程并命名。 2. **线程启动**调用start()启动三个线程并发执行run()方法。 3. **初始状态** - 学生1打印睡觉提示进入10秒休眠。 - 学生2打印睡觉提示进入60秒休眠。 - 老师循环3次打印“上课”每次间隔0.5秒。 4. **第一次唤醒**老师完成3次输出后调用student1.interrupt()学生1休眠被打断输出唤醒提示随后唤醒学生2。 5. **第二次唤醒**学生2休眠被打断输出唤醒提示最后开始听课所有线程执行完毕。 ## 六、运行结果 说明线程启动顺序存在微小随机性前两行学生输出顺序可能互换不影响整体逻辑。 学生1正在睡觉不听课 学生2正在睡觉不听课 上课 上课 上课 学生1被老师叫醒了 学生1开始听课 学生2被学生1叫醒了 学生2开始听课 ## 七、拓展与总结 1. **时间修改**如果需要还原原题原始时长只需修改sleep参数 - 学生1Thread.sleep(10 * 60 * 1000);10分钟 - 学生2Thread.sleep(60 * 60 * 1000);1小时 2. **核心逻辑总结** - 多线程共享任务统一实现Runnable通过线程对象区分业务。 - 休眠中断组合sleep阻塞线程interrupt唤醒线程是线程简易通信的经典用法。 3. **场景延伸**该思路可拓展到生产者-消费者、定时任务、排队唤醒等多线程业务场景。 本案例简单直观非常适合巩固Java基础多线程知识大家可以自行修改线程名称、休眠时长、输出内容加深练习。