当前位置:首页 > Java > 正文

Java线程间通信详解(从零开始掌握多线程协作)

Java多线程编程中,多个线程常常需要协同工作,这就离不开线程间通信。本文将用通俗易懂的方式,带你从零开始理解并掌握 Java 中线程如何“对话”。

什么是线程间通信?

线程间通信(Inter-Thread Communication)是指多个线程之间通过某种机制交换信息、协调执行顺序的过程。例如:一个线程生产数据,另一个线程消费数据;或者一个线程等待另一个线程完成某项任务后再继续执行。

Java线程间通信详解(从零开始掌握多线程协作) Java线程通信  wait notify机制 线程同步 多线程编程 第1张

Java 中的 wait/notify 机制

Java 提供了 wait()notify()notifyAll() 方法来实现线程间的等待与唤醒。这些方法定义在 Object 类中,必须在 synchronized 同步块中使用。

  • wait():使当前线程进入等待状态,并释放锁。
  • notify():唤醒一个正在等待该对象锁的线程。
  • notifyAll():唤醒所有正在等待该对象锁的线程。

实战示例:生产者-消费者模型

下面是一个经典的“生产者-消费者”例子,演示如何使用 wait/notify机制 实现线程通信:

class SharedResource {    private int data = 0;    private boolean hasData = false; // 标记是否有数据可消费    public synchronized void produce(int value) throws InterruptedException {        while (hasData) {            // 如果已有数据,生产者等待            wait();        }        data = value;        hasData = true;        System.out.println("生产者生产了: " + data);        notify(); // 唤醒消费者    }    public synchronized int consume() throws InterruptedException {        while (!hasData) {            // 如果没有数据,消费者等待            wait();        }        hasData = false;        System.out.println("消费者消费了: " + data);        notify(); // 唤醒生产者        return data;    }}public class ProducerConsumerExample {    public static void main(String[] args) {        SharedResource resource = new SharedResource();        Thread producer = new Thread(() -> {            try {                for (int i = 1; i <= 5; i++) {                    resource.produce(i);                    Thread.sleep(500); // 模拟生产耗时                }            } catch (InterruptedException e) {                e.printStackTrace();            }        });        Thread consumer = new Thread(() -> {            try {                for (int i = 1; i <= 5; i++) {                    resource.consume();                    Thread.sleep(800); // 模拟消费耗时                }            } catch (InterruptedException e) {                e.printStackTrace();            }        });        producer.start();        consumer.start();    }}

关键注意事项

  1. 必须在 synchronized 块中调用 wait()notify(),否则会抛出 IllegalMonitorStateException
  2. 建议使用 while 而不是 if 来检查条件,防止“虚假唤醒”(spurious wakeup)。
  3. notify() 只唤醒一个线程,而 notifyAll() 唤醒所有等待线程——在不确定有多少线程等待时,优先使用 notifyAll() 更安全。

其他线程通信方式

除了 wait/notify,Java 还提供了更高级的工具,如:

  • BlockingQueue:线程安全的队列,天然支持生产者-消费者模式。
  • CountDownLatch / CyclicBarrier:用于线程同步等待。
  • Exchanger:两个线程交换数据。

总结

掌握 Java线程通信 是成为合格 Java 开发者的必经之路。通过 wait()notify(),你可以精确控制线程的协作流程。记住:合理使用同步机制,避免死锁和竞态条件,是编写健壮多线程程序的关键。

希望这篇教程能帮助你轻松入门 多线程编程!动手试试代码,加深理解吧。