导读:本期聚焦于小伙伴创作的《Java如何实现线程间事件通知?Java观察者模式在并发中的应用详解》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《Java如何实现线程间事件通知?Java观察者模式在并发中的应用详解》有用,将其分享出去将是对创作者最好的鼓励。

在Java多线程程序中,线程间事件通知是指一个工作线程在状态改变或任务完成后,主动告知其他等待中的线程。观察者模式天然适合这种场景,但在并发环境中必须处理好可见性、原子性与死锁问题。

Java如何实现线程间事件通知?Java观察者模式在并发中的应用详解

为什么需要线程安全的观察者模式

普通观察者模式在单线程下没有问题,但多个线程同时注册、注销或触发通知时,可能导致通知遗漏或抛出ConcurrentModificationException。并发场景下的核心诉求是:通知过程不阻塞发布线程过久,且所有订阅者都能收到一致事件。

基于并发容器的简单实现

我们可以用ConcurrentHashMap保存观察者,用队列解耦通知行为。

import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

// 事件对象
class Event {
    public final String msg;
    public Event(String msg) {
        this.msg = msg;
    }
}

// 观察者接口
interface Observer {
    void onEvent(Event e);
}

// 线程安全事件总线
class EventBus {
    private final ConcurrentMap<String, Observer> observers = new ConcurrentHashMap<>();
    private final ExecutorService pool = Executors.newCachedThreadPool();

    public void register(String name, Observer o) {
        observers.put(name, o);
    }

    public void unregister(String name) {
        observers.remove(name);
    }

    // 异步通知,避免阻塞发布线程
    public void publish(Event e) {
        for (Observer o : observers.values()) {
            pool.submit(() -> o.onEvent(e));
        }
    }
}

使用阻塞队列解耦

如果观察者处理逻辑很慢,可以改为让观察者自己从BlockingQueue中取事件,发布线程只负责入队。

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;

public class QueueObserver implements Runnable {
    private final BlockingQueue<Event> queue = new ArrayBlockingQueue<>(100);

    public void accept(Event e) throws InterruptedException {
        queue.put(e);
    }

    @Override
    public void run() {
        try {
            while (true) {
                Event e = queue.take();
                System.out.println("处理事件:" + e.msg);
            }
        } catch (InterruptedException ex) {
            Thread.currentThread().interrupt();
        }
    }
}

与内置API的对比

Java旧版提供了java.util.ObservableObserver,但它们的notifyObservers方法是同步的,且已被标记为废弃。在新代码中更推荐上述并发工具方案。

方案线程安全通知方式
Observable否,需自行同步同步调用
ConcurrentHashMap+线程池异步执行
BlockingQueue生产消费解耦

实践建议

  • 发布线程不要直接调用耗时观察者逻辑,优先异步化。
  • 注册和注销方法必须使用线程安全容器。
  • 事件对象应为不可变类,防止共享状态被修改。
观察者模式在并发中的价值在于解耦生产者和消费者,但只有配合正确的并发工具,才能真正实现安全的线程间事件通知。

Java线程间事件通知观察者模式修改时间:2026-07-29 06:57:17

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。