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()方法中,如果isPausedtrue,则线程进入等待状态。当调用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()方法中,如果isPausedtrue,则线程进入等待状态。当调用resume()方法时,通过notify()方法唤醒线程继续执行。

3. 使用Lock和Condition接口

Java中的java.util.concurrent.locks包提供了一个Lock接口和一个Condition接口,用于实现线程的暂停和继续。下面是一个使用LockCondition接口来实现线程暂停和继续的示例:

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