Java 线程的暂停与恢复

Java 是一种多线程编程语言,允许程序在同一时间并行处理多个任务。在多线程编程中,有时我们需要暂停和恢复线程的执行。本文将探讨 Java 线程的暂停与恢复机制,提供代码示例,并通过类图和饼状图进行可视化展示。

线程的基本概念

在 Java 中,线程是执行代码的基本单元,一个程序可以包含多个线程并发执行。为了管理多线程,Java 提供了一些关键的方法和类。

线程的创建

在 Java 中创建线程有两种主要方式:继承 Thread 类或者实现 Runnable 接口。

class MyThread extends Thread {
    @Override
    public void run() {
        for (int i = 0; i < 5; i++) {
            System.out.println(Thread.currentThread().getName() + " - " + i);
        }
    }
}

public class ThreadExample {
    public static void main(String[] args) {
        MyThread thread1 = new MyThread();
        MyThread thread2 = new MyThread();
        thread1.start();
        thread2.start();
    }
}

线程的状态

Java 线程有五种状态:新建、就绪、运行、阻塞和死亡。在这些状态中,线程的暂停与恢复主要发生在阻塞状态下。

线程的暂停与恢复

使用 Thread.sleep()

最常见的暂停线程的方法是使用 Thread.sleep() 方法。此方法使线程在指定的时间内停止执行。

public class SleepExample {
    public static void main(String[] args) {
        Thread thread = new Thread(() -> {
            for (int i = 0; i < 5; i++) {
                System.out.println(Thread.currentThread().getName() + " - " + i);
                try {
                    Thread.sleep(1000); // 暂停 1 秒
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        
        thread.start();
    }
}

使用 wait()notify()

另一种暂停和恢复线程的方法是通过 wait()notify() 方法。这两种方法需要在同步块中使用。

class PauseResume {
    private final Object lock = new Object();
    private boolean paused = false;

    public void pause() {
        paused = true;
    }

    public void resume() {
        synchronized (lock) {
            paused = false;
            lock.notifyAll();
        }
    }

    public void run() {
        while (true) {
            synchronized (lock) {
                while (paused) {
                    try {
                        lock.wait(); // 暂停线程
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
            System.out.println("Thread is running: " + Thread.currentThread().getName());
        }
    }
}

public class PauseResumeExample {
    public static void main(String[] args) {
        PauseResume pr = new PauseResume();
        Thread thread = new Thread(pr::run);
        thread.start();

        // 暂停线程
        pr.pause();
        
        // 你可以在这里添加另一个线程来控制暂停状态的切换
        // 这只是一个示例
        new Thread(() -> {
            try {
                Thread.sleep(3000); // 让主线程暂停 3 秒
                pr.resume(); // 然后恢复线程
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }).start();
    }
}

类图

我们可以使用类图展示上述暂停和恢复的类关系。以下为类图的 mermaid 形式表示:

classDiagram
    class PauseResume {
        +Object lock
        +boolean paused
        +void pause()
        +void resume()
        +void run()
    }
    class PauseResumeExample {
        +void main(String[] args)
    }

可视化数据分析

为了更好地理解 Java 线程的暂停与恢复机制,我们可以使用饼状图展示我们在代码中见到的线程状态。以下是通过 mermaid 语法呈现的饼状图:

pie
    title Thread States Distribution
    "New" : 20
    "Runnable" : 30
    "Blocked" : 25
    "Waiting" : 15
    "Terminated" : 10

结论

本文介绍了 Java 线程的基本概念,展示了如何通过 Thread.sleep()wait()notify() 等方法来暂停和恢复线程。理解这些机制不仅对实现多线程程序至关重要,而且在调试和优化程序性能时也能够发挥重要作用。希望通过本文的示例和可视化展示,读者能够更深入地理解 Java 的多线程编程,进而在实际开发中灵活运用这些技术。多线程为我们提供了强大的工具,使我们能够更高效地完成复杂任务,充分利用计算机的资源。