Java多种方式实现生产者消费者模式

实现生产者消费者模式是 Java 多线程编程中的一个重要概念。在多线程环境下,生产者和消费者可以并行执行,提高了程序的效率。这里将详细讲解 Java 多种方式实现生产者消费者模式的完整攻略。

1. 管程法

管程法是最常用的实现生产者消费者模式的方法之一。它要求生产者和消费者共享同一个缓冲区,由缓冲区提供同步的方法供生产者和消费者调用。

以下是管程法的实现示例代码:

public class Buffer {
    private int data;
    private boolean empty = true;

    public synchronized int get() {
        while (empty) {
            try {
                wait();
            } catch (InterruptedException e) {}
        }
        empty = true;
        notifyAll();
        return data;
    }

    public synchronized void put(int data) {
        while (!empty) {
            try {
                wait();
            } catch (InterruptedException e) {}
        }
        empty = false;
        this.data = data;
        notifyAll();
    }
}

public class Producer extends Thread {
    private Buffer buffer;

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

    public void run() {
        for (int i = 0; i < 10; i++) {
            buffer.put(i);
            System.out.println("Producer put: " + i);
            try {
                sleep((int)(Math.random() * 100));
            } catch (InterruptedException e) {}
        }
    }
}

public class Consumer extends Thread {
    private Buffer buffer;

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

    public void run() {
        for (int i = 0; i < 10; i++) {
            int data = buffer.get();
            System.out.println("Consumer get: " + data);
            try {
                sleep((int)(Math.random() * 100));
            } catch (InterruptedException e) {}
        }
    }
}

public class Main {
    public static void main(String[] args) {
        Buffer buffer = new Buffer();
        Producer producer = new Producer(buffer);
        Consumer consumer = new Consumer(buffer);
        producer.start();
        consumer.start();
    }
}

2. 信号量法

信号量法是另一种实现生产者消费者模式的方法,它使用了信号量机制对临界区资源进行同步控制。

以下是信号量法的实现示例代码:

public class Buffer {
    private int data;
    private Semaphore mutex = new Semaphore(1);
    private Semaphore full = new Semaphore(0);
    private Semaphore empty;

    public Buffer(int size) {
        empty = new Semaphore(size);
    }

    public void get() throws InterruptedException {
        full.acquire();
        mutex.acquire();
        System.out.println(Thread.currentThread().getName() +
                           " Consumer get: " + data);
        Thread.sleep((int)(Math.random() * 100));
        mutex.release();
        empty.release();
    }

    public void put(int data) throws InterruptedException {
        empty.acquire();
        mutex.acquire();
        this.data = data;
        System.out.println(Thread.currentThread().getName() +
                           " Producer put: " + data);
        Thread.sleep((int)(Math.random() * 100));
        mutex.release();
        full.release();
    }
}

public class Producer extends Thread {
    private Buffer buffer;

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

    public void run() {
        for (int i = 0; i < 10; i++) {
            try {
                buffer.put(i);
            } catch (InterruptedException e) {}
        }
    }
}

public class Consumer extends Thread {
    private Buffer buffer;

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

    public void run() {
        for (int i = 0; i < 10; i++) {
            try {
                buffer.get();
            } catch (InterruptedException e) {}
        }
    }
}

public class Main {
    public static void main(String[] args) {
        Buffer buffer = new Buffer(5);
        Producer producer = new Producer(buffer);
        Consumer consumer = new Consumer(buffer);
        producer.start();
        consumer.start();
    }
}

以上代码演示了信号量法的实现过程,在实现时,我们需要使用 Semaphore 类创建互斥量和信号量对象,调用其 acquire() 和 release() 方法实现同步控制和线程阻塞。

综上所述,通过管程法和信号量法我们可以实现 Java 的生产者消费者模式。我们只需要根据自己的需求合理选择适合的方法即可。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java多种方式实现生产者消费者模式 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • 关于Spring Data Jpa 自定义方法实现问题

    关于Spring Data JPA自定义方法实现问题的攻略包含以下内容。 什么是Spring Data JPA自定义方法? Spring Data JPA是Spring Data项目的一个子项目,它是对JPA(Java Persistence API)的扩展和实现,让我们能够更方便地操作数据库。其中自定义方法是指通过JPA的命名规则或通过@Query注解实现…

    Java 2023年6月2日
    00
  • Java Switch对各类型支持实现原理

    Java Switch语句是一种用于多路分支的选择结构,可以根据不同的值进行分支判断。它可以对各种数据类型进行支持,包括但不限于整型、字符型、字符串型、枚举型等,本篇攻略将为你详细讲解Java Switch对各类型支持的实现原理。 1. 整型 在Java Switch语句中,整型是最基本的数据类型之一,因此Java对其的支持也是最完善的。实现原理是通过对整型…

    Java 2023年5月26日
    00
  • SpringBoot中整合MyBatis-Plus的方法示例

    Sure,下面是SpringBoot整合MyBatis-Plus的方法示例完整攻略: 一、前置准备 JDK 1.8+ Maven 3.0+ SpringBoot 2.0+ MyBatis-Plus 3.1.0+ 二、项目搭建 1. 创建SpringBoot项目 通过 Spring Initializer,创建一个 SpringBoot 项目,并导入 Mave…

    Java 2023年5月20日
    00
  • 简单了解SpringMVC常用组件作用解析

    以下是关于“简单了解SpringMVC常用组件作用解析”的完整攻略,其中包含两个示例。 简单了解SpringMVC常用组件作用解析 SpringMVC是一个基于MVC构架的Web框架,它提供了一种灵活、高效的方式来开发Web应用程序。在SpringMVC中,有一些常用的组件,下面我们来简单了解一下这些组件的作用。 DispatcherServlet Disp…

    Java 2023年5月16日
    00
  • Java实例化的几种方法总结

    Java实例化的几种方法总结 在Java中,对象是类的一个实例,而实例化则是创建这个实例的过程。Java提供了多种实例化对象的方法。以下是几种常见的实例化方法总结: 1. 使用new关键字 使用new关键字是最常见的实例化对象的方法。语法如下: ClassName objectName = new ClassName(); 其中,ClassName表示类的名…

    Java 2023年5月26日
    00
  • 浅谈SpringBoot内嵌Tomcat的实现原理解析

    浅谈SpringBoot内嵌Tomcat的实现原理解析 简介 SpringBoot是一个用于快速构建应用程序的框架,它使用内嵌的Tomcat作为默认的Web容器。那么,SpringBoot内嵌Tomcat的实现原理是什么呢?本文旨在解析SpringBoot内嵌Tomcat的实现原理,帮助您更好地了解SpringBoot的底层实现。 SpringBoot内嵌T…

    Java 2023年6月2日
    00
  • 2022 最新 IntelliJ IDEA 详细配置步骤演示(推荐)

    2022 最新 IntelliJ IDEA 详细配置步骤演示(推荐) IntelliJ IDEA 是一款经典的集成开发环境,支持多种编程语言,包括 Java、Python、Kotlin、Ruby 等等。在使用 IntelliJ IDEA 进行开发之前,我们必须进行一些配置,以便更好地使用这个开发工具。本文将详细介绍 IntelliJ IDEA 的配置步骤。如…

    Java 2023年5月20日
    00
  • 通过button将form表单的数据提交到action层的实例

    以下是通过button将form表单的数据提交到action层的攻略: 1. 编写HTML代码 首先,我们需要编写一个HTML表单,包含要提交的数据和一个提交按钮。例如: <form action="/submit" method="POST"> <label for="name"…

    Java 2023年6月15日
    00
合作推广
合作推广
分享本页
返回顶部