java中实现线程暂停/恢复需用volatile标志配合wait/notify或locksupport,通过状态检查与同步机制在run()循环中控制执行;禁用已废弃的suspend/resume方法。

Java中通过实现Runnable接口本身无法直接支持暂停与恢复,因为线程的暂停/恢复不是Runnable职责,而是由线程控制逻辑和状态协同完成。真正可行的方式是:在Runnable内部维护一个**线程安全的状态标志(如volatile boolean paused)**,配合wait()/notify()或LockSupport等机制,在循环体中主动检查并响应暂停/恢复信号。
使用volatile标志 + wait/notify实现可控暂停/恢复
这是最常用、语义清晰且兼容性好的方式。关键点在于:
-
用
volatile修饰暂停标志,确保多线程间状态可见性 - 用对象锁(如
Object lock = new Object())保护状态变更和等待逻辑 - 在
run()方法主循环中定期检查标志,进入wait()等待唤醒 - 暂停时调用
lock.wait(),恢复时调用lock.notify()(注意用notifyAll()更安全)
示例片段:
public class PausableTask implements Runnable {
private final Object lock = new Object();
private volatile boolean running = true;
private volatile boolean paused = false;
<pre class="brush:java;toolbar:false;">@Override
public void run() {
while (running) {
if (paused) {
synchronized (lock) {
while (paused && running) {
try {
lock.wait(); // 等待恢复
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
return;
}
}
}
}
// 执行实际任务(例如处理一批数据)
doWork();
// 可选:短暂让出CPU,避免忙等
try { Thread.sleep(10); } catch (InterruptedException e) { return; }
}
}
public void pause() {
paused = true;
}
public void resume() {
synchronized (lock) {
paused = false;
lock.notifyAll();
}
}
public void stop() {
running = false;
synchronized (lock) {
lock.notifyAll();
}
}
private void doWork() { /* 具体业务逻辑 */ }}
使用ReentrantLock + Condition替代synchronized/wait
若需更灵活的等待队列或超时控制,可用ReentrantLock搭配Condition:
- 定义
private final Lock lock = new ReentrantLock();和private final Condition pausedCond = lock.newCondition(); -
pause()只需设paused = true;resume()中加锁后调用pausedCond.signalAll() -
run()中在while (paused && running)内调用pausedCond.await() - 注意每次
await()前必须先lock.lock(),且在finally中释放
不推荐但需避开的误区
-
不要用
Thread.suspend()/resume():已废弃,存在死锁风险(如暂停时持有了锁) -
不要仅靠
volatile boolean轮询而不阻塞:会浪费CPU,且无法精准控制执行节奏 -
不要在
wait()外修改paused后不通知:会导致线程永远挂起 -
避免在
run()中捕获InterruptedException却不恢复中断状态:应调用Thread.currentThread().interrupt()
启动与管理示例
使用方式简洁明了:
PausableTask task = new PausableTask(); Thread t = new Thread(task); t.start(); <p>// 暂停 task.pause();</p><p>// 恢复 task.resume();</p><p>// 安全停止 task.stop(); t.join(); // 等待结束</p>
注意:暂停/恢复操作可由任意线程调用,无需与工作线程同源。整个机制轻量、无侵入,完全基于标准API,不依赖第三方库。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











