上一篇
Java程序中如何有效唤醒处于睡眠状态的线程?
- 后端开发
- 2025-10-16
- 8
在Java中,当线程处于睡眠状态时,我们可以通过以下几种方法唤醒它:
使用interrupt()方法
-
原理:调用Thread.interrupt()方法,设置线程的中断状态。
-
实现:
public class SleepThread extends Thread { public void run() { try { Thread.sleep(10000); // 线程休眠10秒 } catch (InterruptedException e) { System.out.println("线程被唤醒"); } } } public class Main { public static void main(String[] args) throws InterruptedException { SleepThread thread = new SleepThread(); thread.start(); Thread.sleep(5000); // 主线程休眠5秒 thread.interrupt(); // 唤醒子线程 } } -
注意:interrupt()方法只能唤醒通过sleep()方法休眠的线程,如果线程是无限休眠(例如Thread.sleep(1)),则无法通过interrupt()唤醒。
使用join()方法
-
原理:调用Thread.join()方法,当前线程等待指定的线程结束。
-
实现:

public class SleepThread extends Thread { public void run() { try { Thread.sleep(10000); // 线程休眠10秒 } catch (InterruptedException e) { System.out.println("线程被唤醒"); } } } public class Main { public static void main(String[] args) throws InterruptedException { SleepThread thread = new SleepThread(); thread.start(); thread.join(); // 等待子线程结束 } }
-
注意:使用join()方法唤醒线程时,当前线程会等待指定的线程结束,因此主线程不会继续执行。
-
原理:调用Thread.notify()或Thread.notifyAll()方法,唤醒在指定对象上等待的线程。
-
实现:
public class SleepThread extends Thread { private final Object lock = new Object(); public void run() { synchronized (lock) { try { Thread.sleep(10000); // 线程休眠10秒 } catch (InterruptedException e) { System.out.println("线程被唤醒"); } } } } public class Main { public static void main(String[] args) throws InterruptedException { SleepThread thread = new SleepThread(); thread.start(); Thread.sleep(5000); // 主线程休眠5秒 synchronized (thread) { thread.notify(); // 唤醒子线程 } } } -
注意:使用notify()或notifyAll()方法唤醒线程时,线程需要获得锁。

使用notify()或notifyAll()方法
| 方法 | 原理 | 实现 | 注意 |
|---|---|---|---|
| interrupt() | 设置线程中断状态 | thread.interrupt() | 只能唤醒通过sleep()休眠的线程 |
| join() | 等待线程结束 | thread.join() | 当前线程会等待指定的线程结束 |
| notify()/notifyAll() | 唤醒在指定对象上等待的线程 | synchronized (object) { object.notify(); } | 线程需要获得锁 |
FAQs
Q1:如何判断线程是否被唤醒?
A1:在catch块中,可以通过捕获InterruptedException来判断线程是否被唤醒。
Q2:使用interrupt()方法唤醒线程时,为什么线程不会立即醒来?
A2:即使设置了线程的中断状态,线程仍然需要检查这个状态,如果线程正在执行一个长时间的阻塞操作,例如sleep(),则线程需要从阻塞操作中返回,才能检查中断状态,线程不会立即醒来。