在Java多线程编程中,多个线程常常需要协同工作,这就离不开线程间通信。本文将用通俗易懂的方式,带你从零开始理解并掌握 Java 中线程如何“对话”。
线程间通信(Inter-Thread Communication)是指多个线程之间通过某种机制交换信息、协调执行顺序的过程。例如:一个线程生产数据,另一个线程消费数据;或者一个线程等待另一个线程完成某项任务后再继续执行。
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(); }} synchronized 块中调用 wait() 和 notify(),否则会抛出 IllegalMonitorStateException。while 而不是 if 来检查条件,防止“虚假唤醒”(spurious wakeup)。notify() 只唤醒一个线程,而 notifyAll() 唤醒所有等待线程——在不确定有多少线程等待时,优先使用 notifyAll() 更安全。除了 wait/notify,Java 还提供了更高级的工具,如:
掌握 Java线程通信 是成为合格 Java 开发者的必经之路。通过 wait() 和 notify(),你可以精确控制线程的协作流程。记住:合理使用同步机制,避免死锁和竞态条件,是编写健壮多线程程序的关键。
希望这篇教程能帮助你轻松入门 多线程编程!动手试试代码,加深理解吧。
本文由主机测评网于2025-12-03发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://vpshk.cn/2025122275.html