用java实现生产者和消费者模式

简介: 用java实现生产者和消费者模式

下面是一个使用Java实现生产者和消费者模式的简单示例:

import java.util.LinkedList;

public class ProducerConsumerExample {
   
    public static void main(String[] args) {
   
        Buffer buffer = new Buffer(5); // 缓冲区大小为5
        Producer producer = new Producer(buffer);
        Consumer consumer = new Consumer(buffer);

        Thread producerThread = new Thread(producer);
        Thread consumerThread = new Thread(consumer);

        producerThread.start();
        consumerThread.start();
    }
}

class Buffer {
   
    private LinkedList<Integer> queue;
    private int capacity;

    public Buffer(int capacity) {
   
        this.capacity = capacity;
        this.queue = new LinkedList<>();
    }

    public void produce(int item) throws InterruptedException {
   
        synchronized (this) {
   
            while (queue.size() == capacity) {
   
                wait();
            }

            queue.add(item);
            System.out.println("生产者生产了:" + item);
            notify();
        }
    }

    public void consume() throws InterruptedException {
   
        synchronized (this) {
   
            while (queue.isEmpty()) {
   
                wait();
            }

            int item = queue.remove();
            System.out.println("消费者消费了:" + item);
            notify();
        }
    }
}

class Producer implements Runnable {
   
    private Buffer buffer;

    public Producer(Buffer buffer) {
   
        this.buffer = buffer;
    }

    @Override
    public void run() {
   
        try {
   
            for (int i = 1; i <= 10; i++) {
   
                buffer.produce(i);
                Thread.sleep(1000); // 模拟生产者生产的时间
            }
        } catch (InterruptedException e) {
   
            e.printStackTrace();
        }
    }
}

class Consumer implements Runnable {
   
    private Buffer buffer;

    public Consumer(Buffer buffer) {
   
        this.buffer = buffer;
    }

    @Override
    public void run() {
   
        try {
   
            for (int i = 1; i <= 10; i++) {
   
                buffer.consume();
                Thread.sleep(2000); // 模拟消费者消费的时间
            }
        } catch (InterruptedException e) {
   
            e.printStackTrace();
        }
    }
}

上面的代码中,我们定义了一个Buffer类作为缓冲区,它维护一个LinkedList作为队列来存放生产者生产的数据。

生产者线程通过调用produce方法向缓冲区中添加数据,如果缓冲区已满,则生产者线程会等待,直到有空间可用并通知消费者线程。

消费者线程通过调用consume方法从缓冲区中消费数据,如果缓冲区为空,则消费者线程会等待,直到有数据可消费并通知生产者线程。

main方法中,我们创建了一个Buffer实例,并创建生产者和消费者线程并启动它们。

运行代码后,你将会看到生产者不断地生产数据,而消费者不断地消费数据,它们之间通过缓冲区实现了同步和通信。

相关文章
|
1月前
|
设计模式 安全 NoSQL
【设计模式】JAVA Design Patterns——Abstract-document(抽象文档模式)
【设计模式】JAVA Design Patterns——Abstract-document(抽象文档模式)
|
1月前
|
设计模式 Java API
【设计模式】JAVA Design Patterns——Combinator(功能模式)
【设计模式】JAVA Design Patterns——Combinator(功能模式)
|
1月前
|
设计模式 监控 Java
【设计模式】JAVA Design Patterns——Circuit Breaker(断路器模式)
【设计模式】JAVA Design Patterns——Circuit Breaker(断路器模式)
|
1月前
|
设计模式 Java 程序员
【设计模式】JAVA Design Patterns——Bytecode(字节码模式)
【设计模式】JAVA Design Patterns——Bytecode(字节码模式)
|
1月前
|
设计模式 算法 Java
【设计模式】JAVA Design Patterns——Builder(构造器模式)
【设计模式】JAVA Design Patterns——Builder(构造器模式)
|
1月前
|
设计模式 Java 容器
【设计模式】JAVA Design Patterns——Async Method Invocation(异步方法调用模式)
【设计模式】JAVA Design Patterns——Async Method Invocation(异步方法调用模式)
|
1月前
|
设计模式 Java API
【设计模式】JAVA Design Patterns——Aggregator Microservices(聚合器微服务模式)
【设计模式】JAVA Design Patterns——Aggregator Microservices(聚合器微服务模式)
|
1月前
|
设计模式 Java 数据库
【设计模式】JAVA Design Patterns——Converter(转换器模式)
转换器模式旨在实现不同类型间的双向转换,减少样板代码。它通过通用的Converter类和特定的转换器(如UserConverter)简化实例映射。Converter类包含两个Function对象,用于不同类型的转换,同时提供列表转换方法。当需要在逻辑上对应的类型间转换,或处理DTO、DO时,此模式尤为适用。
【设计模式】JAVA Design Patterns——Converter(转换器模式)
|
1月前
|
消息中间件 缓存 Java
【Java】全套云HIS(医院信息管理系统)可对接医保 采用云端SaaS模式部署
总体框架: SaaS应用,全浏览器访问 前后端分离,多服务协同 服务可拆分,功能易扩展
55 1
【Java】全套云HIS(医院信息管理系统)可对接医保 采用云端SaaS模式部署
|
26天前
|
存储 前端开发 Java
Java一分钟之-Java GUI设计原则与模式
本文介绍了Java GUI开发的核心设计原则和模式,包括分层架构(MVC)、组件复用、用户体验和代码示例。强调了MVC模式以提高代码可维护性,组件化设计以增强复用性,以及响应式和简洁界面以提升用户体验。同时,提出了常见问题的避免策略,如布局管理、资源释放和国际化支持,建议开发者遵循这些原则以提升GUI应用质量。
72 3