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

Java常见的并发设计模式

1. 经典生产者-消费者模式

  • 核心思想:生产者生产数据放入缓冲区,消费者从缓冲区取数据处理,二者通过阻塞队列(如 BlockingQueue)协调。
  • 适用场景:消息队列、任务调度、数据处理管道。
  • 实现方式
    • 使用 BlockingQueue(如 LinkedBlockingQueue
    • 使用 wait/notify
    • 使用 LockCondition

示例:

class Producer implements Runnable {
    private BlockingQueue<Integer> queue;
    public Producer(BlockingQueue<Integer> queue) { this.queue = queue; }
    public void run() {
        try {
            while (true) {
                int item = new Random().nextInt(100);
                queue.put(item);  // 阻塞式放入
                System.out.println("生产:" + item);
                Thread.sleep(100);
            }
        } catch (InterruptedException e) { Thread.currentThread().interrupt(); }
    }
}

class Consumer implements Runnable {
    private BlockingQueue<Integer> queue;
    public Consumer(BlockingQueue<Integer> queue) { this.queue = queue; }
    public void run() {
        try {
            while (true) {
                int item = queue.take();  // 阻塞式获取
                System.out.println("消费:" + item);
                Thread.sleep(200);
            }
        } catch (InterruptedException e) { Thread.currentThread().interrupt(); }
    }
}

public class ProducerConsumerExample {
    public static void main(String[] args) {
        BlockingQueue<Integer> queue = new LinkedBlockingQueue<>(10);
        new Thread(new Producer(queue)).start();
        new Thread(new Consumer(queue)).start();
    }
}

2. 观察者模式(Observer Pattern)

  • 核心思想:一个对象(Subject)发生变化时,通知多个观察者(Observer)。
  • 适用场景:事件驱动系统(如 GUI 事件监听、消息通知)。
  • 实现方式
    • java.util.Observer(Java 9 之后被弃用)
    • java.beans.PropertyChangeListener
    • 自定义回调函数模式

示例:

interface Observer {
    void update(String message);
}

class ConcreteObserver implements Observer {
    private String name;
    public ConcreteObserver(String name) { this.name = name; }
    public void update(String message) {
        System.out.println(name + " 收到消息: " + message);
    }
}

class Subject {
    private List<Observer> observers = new ArrayList<>();
    public void addObserver(Observer observer) { observers.add(observer); }
    public void notifyObservers(String message) {
        for (Observer observer : observers) {
            observer.update(message);
        }
    }
}

public class ObserverExample {
    public static void main(String[] args) {
        Subject subject = new Subject();
        Observer o1 = new ConcreteObserver("A");
        Observer o2 = new ConcreteObserver("B");
        subject.addObserver(o1);
        subject.addObserver(o2);
        subject.notifyObservers("新任务来了");
    }
}

3. 生产者-消费者-缓冲池模式(Producer-Consumer-Pool)

  • 核心思想:在生产者和消费者之间加入一个线程池(如 ThreadPoolExecutor),用于处理任务,而不是直接由消费者消费。
  • 适用场景:高吞吐任务处理,如 Web 服务器、日志处理。
  • 实现方式
    • ExecutorService 线程池
    • BlockingQueue

示例:

public class ThreadPoolProducerConsumer {
    public static void main(String[] args) {
        ExecutorService executor = Executors.newFixedThreadPool(3);
        BlockingQueue<Integer> queue = new LinkedBlockingQueue<>(10);

        Runnable producer = () -> {
            try {
                while (true) {
                    int item = new Random().nextInt(100);
                    queue.put(item);
                    System.out.println("生产:" + item);
                    Thread.sleep(100);
                }
            } catch (InterruptedException e) { Thread.currentThread().interrupt(); }
        };

        Runnable consumer = () -> {
            try {
                while (true) {
                    int item = queue.take();
                    System.out.println("消费:" + item);
                    Thread.sleep(200);
                }
            } catch (InterruptedException e) { Thread.currentThread().interrupt(); }
        };

        executor.execute(producer);
        executor.execute(consumer);
        executor.shutdown();
    }
}

4. 事件驱动架构(EDA - Event-Driven Architecture)

  • 核心思想:生产者触发事件,消费者以异步方式处理事件。
  • 适用场景:微服务架构、消息队列(Kafka、RabbitMQ)。
  • 实现方式
    • CompletableFuture
    • EventBus
    • 消息队列(如 Kafka)

示例(CompletableFuture):

import java.util.concurrent.*;

public class EventDrivenExample {
    public static void main(String[] args) {
        CompletableFuture.runAsync(() -> {
            try {
                System.out.println("生产事件");
                Thread.sleep(1000);
            } catch (InterruptedException e) { e.printStackTrace(); }
        }).thenRun(() -> System.out.println("消费事件"));
    }
}

5. 责任链模式(Chain of Responsibility Pattern)

  • 核心思想:多个处理者形成链条,依次处理请求,直到找到合适的处理者。
  • 适用场景:日志处理、权限控制、请求过滤。
  • 实现方式
    • 设计链式调用模式
    • FilterChain 机制(如 Servlet 过滤器)

示例:

abstract class Handler {
    protected Handler next;
    public void setNext(Handler next) { this.next = next; }
    public abstract void handleRequest(int request);
}

class ConcreteHandlerA extends Handler {
    public void handleRequest(int request) {
        if (request < 10) {
            System.out.println("A 处理请求: " + request);
        } else if (next != null) {
            next.handleRequest(request);
        }
    }
}

class ConcreteHandlerB extends Handler {
    public void handleRequest(int request) {
        System.out.println("B 处理请求: " + request);
    }
}

public class ChainExample {
    public static void main(String[] args) {
        Handler handlerA = new ConcreteHandlerA();
        Handler handlerB = new ConcreteHandlerB();
        handlerA.setNext(handlerB);

        handlerA.handleRequest(5);
        handlerA.handleRequest(15);
    }
}

总结

模式适用场景特点
生产者-消费者模式任务队列多线程并发控制
观察者模式事件通知低耦合,异步
生产者-消费者-缓冲池高并发任务处理使用线程池优化资源
事件驱动架构(EDA)微服务,消息驱动异步,解耦
责任链模式过滤器,权限控制链式调用

如果你是做 高并发系统、微服务、消息队列,可以考虑 事件驱动生产者-消费者模式。如果是 GUI 事件、回调机制观察者模式 更适用。

 

相关文章:

  • 【网络协议详解】——MPLS LDP技术(学习笔记)
  • OWL 项目与多智能体系统(MAS)的区别与联系分析
  • 2.2.3 TCP—UDP-QUIC
  • C#+AForge 实现视频录制
  • 大数据学习(62)- Hadoop-yarn
  • 【操作系统安全】任务1:操作系统部署
  • Linux 查看几个核心
  • Spring之生命周期Bean的生成过程
  • 对比 Vue2 选项式 API 与 Vue3 setup 语法
  • Ubuntu 22.04使用pigz多线程快速解压/压缩文件
  • 【MySQL基础-3】SQL语言详解:定义、分类、注意事项与注释
  • 【Python】06、流程控制语句
  • 系统开发资源
  • 大模型AI相关记录
  • sql靶场--布尔盲注(第八关)保姆级教程
  • OpenHarmony-分布式硬件关键技术
  • 2025-03-12 Python深度学习1——安装Anaconda与PyTorch库
  • 在 C# 中,is null 和 == null ‌不完全等价‌
  • 《算法篇:翻转字符串里的单词 - Java 多种解法详解》
  • IMX6ULL驱动开发Linux篇01
  • 426.8万人次!长三角铁路创单日客发量历史新高
  • 11家券商一季度净利翻番:9家利润超20亿,国泰海通居首
  • 王毅谈金砖国家开展斡旋调解的经验和独特优势
  • 停电催生商机,中国品牌 “照亮” 西班牙
  • 南部战区位南海海域进行例行巡航
  • 李在明涉嫌违反《公职选举法》案将于5月1日宣判