Java线程暂停与继续
引言
在Java多线程编程中,线程的暂停和继续是常见的需求。例如,在某些情况下,我们希望主线程暂停,等待其他线程执行完成后再继续执行。这种需求可以通过Java中的一些机制来实现。
本文将介绍几种常见的线程暂停和继续的方式,并提供相应的代码示例。
1. 使用wait()和notify()方法
Java中的每个对象都有一个锁和一个等待队列。线程可以通过调用对象的wait()方法来释放锁,并让自己进入等待队列。当某个条件满足时,线程可以调用对象的notify()方法来通知等待队列中的线程继续执行。下面是一个使用wait()和notify()方法来实现线程暂停和继续的示例:
class MyThread implements Runnable {
private boolean isPaused = false;
public synchronized void pause() {
isPaused = true;
}
public synchronized void resume() {
isPaused = false;
notify();
}
@Override
public void run() {
while (true) {
synchronized (this) {
while (isPaused) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
// 线程的执行逻辑
// 暂停执行
pause();
}
}
}
在上述示例中,我们使用了一个isPaused
变量来表示线程是否处于暂停状态。线程的run()
方法中,如果isPaused
为true
,则线程进入等待状态。当调用resume()
方法时,通过notify()
方法唤醒线程继续执行。
2. 使用Thread的suspend()和resume()方法
Java中的Thread类提供了suspend()
和resume()
方法,用于暂停和继续线程的执行。但是,这两个方法已经被标记为过时,不推荐使用,因为它们可能导致线程死锁的问题。
不过,我们仍然可以使用这两个方法来完成线程的暂停和继续的功能。下面是一个使用suspend()
和resume()
方法来实现线程暂停和继续的示例:
class MyThread implements Runnable {
private boolean isPaused = false;
public synchronized void pause() {
isPaused = true;
}
public synchronized void resume() {
isPaused = false;
notify();
}
@Override
public void run() {
while (true) {
synchronized (this) {
while (isPaused) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
// 线程的执行逻辑
// 暂停执行
suspend();
}
}
}
在上述示例中,我们使用了一个isPaused
变量来表示线程是否处于暂停状态。线程的run()
方法中,如果isPaused
为true
,则线程进入等待状态。当调用resume()
方法时,通过notify()
方法唤醒线程继续执行。
3. 使用Lock和Condition接口
Java中的java.util.concurrent.locks
包提供了一个Lock
接口和一个Condition
接口,用于实现线程的暂停和继续。下面是一个使用Lock
和Condition
接口来实现线程暂停和继续的示例:
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
class MyThread implements Runnable {
private boolean isPaused = false;
private Lock lock = new ReentrantLock();
private Condition condition = lock.newCondition();
public void pause() {
lock.lock();
try {
isPaused = true;
} finally {
lock.unlock();
}
}
public void resume() {
lock.lock();
try {
isPaused = false;
condition.signal();
} finally {
lock.unlock();
}
}
@Override
public void run() {
while (true) {
lock.lock();
try {
while (isPaused) {
condition.await();
}
} catch (InterruptedException e) {
e