Java中实现线程暂停的几种方法及其适用场景有哪些?
- 后端开发
- 2025-10-20
- 6
在Java中,暂停一个线程可以通过多种方式实现,以下是一些常见的方法,以及它们的工作原理和示例代码。
使用Thread.sleep(long millis)
Thread.sleep(long millis)方法是Thread类提供的一个静态方法,用于暂停当前线程的执行,该方法接收一个long类型的参数,表示暂停的毫秒数。
| 参数 | 说明 |
|---|---|
| long millis | 暂停的毫秒数,如果传入0,则线程不会暂停 |
public class SleepExample { public static void main(String[] args) { Thread thread = new Thread(() > { try { System.out.println("Thread started."); Thread.sleep(1000); // 暂停1秒 System.out.println("Thread resumed."); } catch (InterruptedException e) { System.out.println("Thread was interrupted."); } }); thread.start(); } }
使用Object.wait()
Object.wait()方法是Object类提供的一个方法,用于使当前线程等待,直到另一个线程调用该对象的notify()或notifyAll()方法。

| 参数 | 说明 |
|---|---|
| long timeout | 等待时间,如果传入0,则无限期等待 |
public class WaitExample { private static final Object lock = new Object(); public static void main(String[] args) { Thread thread = new Thread(() > { synchronized (lock) { try { System.out.println("Thread started."); lock.wait(); // 等待其他线程调用notify()或notifyAll() System.out.println("Thread resumed."); } catch (InterruptedException e) { System.out.println("Thread was interrupted."); } } }); thread.start(); try { Thread.sleep(1000); // 主线程暂停1秒 } catch (InterruptedException e) { e.printStackTrace(); } synchronized (lock) { lock.notify(); // 唤醒等待的线程 } } }
使用Thread.suspend()和Thread.resume()
Thread.suspend()和Thread.resume()方法是Thread类提供的方法,用于挂起和恢复线程的执行,这两个方法不建议使用,因为它们可能导致死锁。

| 方法 | 说明 |
|---|---|
| Thread.suspend() | 挂起当前线程 |
| Thread.resume() | 恢复挂起的线程 |
public class SuspendResumeExample { public static void main(String[] args) { Thread thread = new Thread(() > { try { System.out.println("Thread started."); Thread.sleep(1000); // 暂停1秒 System.out.println("Thread resumed."); } catch (InterruptedException e) { System.out.println("Thread was interrupted."); } }); thread.start(); thread.suspend(); // 挂起线程 System.out.println("Thread suspended."); thread.resume(); // 恢复线程 System.out.println("Thread resumed."); } }
使用CountDownLatch
CountDownLatch是一个同步辅助类,用于使一个或多个线程等待某个数量的计数器减到零。
| 构造函数 | 说明 |
|---|---|
| CountDownLatch(int count) | 创建一个具有给定计数的CountDownLatch |
import java.util.concurrent.CountDownLatch; public class CountDownLatchExample { public static void main(String[] args) { CountDownLatch latch = new CountDownLatch(1); Thread thread = new Thread(() > { try { System.out.println("Thread started."); latch.await(); // 等待计数器减到0 System.out.println("Thread resumed."); } catch (InterruptedException e) { System.out.println("Thread was interrupted."); } }); thread.start(); try { Thread.sleep(1000); // 主线程暂停1秒 } catch (InterruptedException e) { e.printStackTrace(); } latch.countDown(); // 计数器减1 } }
FAQs
Q1:为什么不建议使用Thread.suspend()和Thread.resume()方法?

A1:Thread.suspend()和Thread.resume()方法可能会导致死锁,因为它们没有提供一种机制来安全地恢复线程,这些方法在Java 9中被标记为过时,因为它们可能会导致线程处于不确定的状态。
Q2:如何确保线程在暂停后能够正确恢复?
A2:确保线程在暂停后能够正确恢复的关键是使用合适的同步机制,使用Object.wait()和Object.notify()方法可以确保线程在等待和恢复过程中保持一致性,在使用Thread.sleep()方法时,需要捕获InterruptedException异常,以确保线程在暂停后能够正确处理中断信号。