Java多线程之线程通信生产者消费者模式及等待唤醒机制代码详解

下面是针对“Java多线程之线程通信生产者消费者模式及等待唤醒机制代码详解”的完整攻略。

什么是生产者消费者模式?

生产者消费者模式是指:生产者生产出来的任务放到一个仓库中,消费者从仓库中取出任务来消费。这样就将生产者和消费者融为一体,实现了解耦和。

生产者消费者模式需要解决的问题是:当仓库中的任务被消费完了,如何实现等待生产者生产新任务,同时也不影响已经在消费的消费者。

等待唤醒机制

在Java多线程中,使用wait()notify()notifyAll()方法等待唤醒机制实现线程之间的通信。

wait()方法的作用是:使当前线程进入等待状态,直到被唤醒。

notify()方法和notifyAll()方法的作用是:唤醒一个或多个等待的线程。

生产者消费者模式代码示例

下面是一个Java多线程之生产者消费者模式的代码示例。

任务类Task

public class Task {
    private int value;

    public Task(int value) {
        this.value = value;
    }

    public int getValue() {
        return value;
    }
}

仓库类Storage

import java.util.LinkedList;

public class Storage {
    private final int MAX_SIZE = 5;
    private LinkedList<Task> tasks = new LinkedList<>();

    public synchronized void put(Task task) {
        while (tasks.size() == MAX_SIZE) {
            try {
                System.out.println("仓库已满,生产者" + Thread.currentThread().getName() + "进入等待状态");
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        System.out.println("生产者" + Thread.currentThread().getName() + "生产了" + task.getValue() + "号商品");
        tasks.add(task);
        notifyAll();
    }

    public synchronized Task get() {
        while (tasks.size() == 0) {
            try {
                System.out.println("仓库为空,消费者" + Thread.currentThread().getName() + "进入等待状态");
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        Task task = tasks.removeFirst();
        System.out.println("消费者" + Thread.currentThread().getName() + "消费了" + task.getValue() + "号商品");
        notifyAll();
        return task;
    }
}

生产者Producer类

public class Producer implements Runnable {
    private Storage storage;

    public Producer(Storage storage) {
        this.storage = storage;
    }

    @Override
    public void run() {
        for (int i = 1; i <= 10; i++) {
            Task task = new Task(i);
            storage.put(task);
        }
    }
}

消费者Consumer类

public class Consumer implements Runnable {
    private Storage storage;

    public Consumer(Storage storage) {
        this.storage = storage;
    }

    @Override
    public void run() {
        for (int i = 1; i <= 10; i++) {
            Task task = storage.get();
        }
    }
}

测试类Test

public class Test {
    public static void main(String[] args) {
        Storage storage = new Storage();

        Producer producer1 = new Producer(storage);
        Producer producer2 = new Producer(storage);
        Consumer consumer1 = new Consumer(storage);
        Consumer consumer2 = new Consumer(storage);

        new Thread(producer1, "生产者1").start();
        new Thread(producer2, "生产者2").start();
        new Thread(consumer1, "消费者1").start();
        new Thread(consumer2, "消费者2").start();
    }
}

在上述代码示例中,Storage类是仓库类,Producer类是生产者类,Consumer类是消费者类,Task类是任务类,Test类是用于测试的主类。

运行测试类,输出内容如下:

仓库已满,生产者生产者1进入等待状态
生产者生产者2生产了1号商品
生产者生产者2生产了2号商品
生产者生产者1生产了3号商品
生产者生产者2生产了4号商品
生产者生产者1生产了5号商品
生产者生产者2进入等待状态
消费者消费者2消费了1号商品
消费者消费者1消费了2号商品
生产者生产者1生产了6号商品
生产者生产者2生产了7号商品
生产者生产者1生产了8号商品
生产者生产者2进入等待状态
消费者消费者1消费了3号商品
消费者消费者2消费了4号商品
生产者生产者1生产了9号商品
生产者生产者2生产了10号商品
仓库为空,消费者消费者2进入等待状态
消费者消费者1消费了5号商品
生产者生产者2生产了6号商品
生产者生产者1生产了7号商品
生产者生产者2生产了8号商品
生产者生产者1生产了9号商品
生产者生产者2进入等待状态
消费者消费者1消费了6号商品
消费者消费者2消费了7号商品
生产者生产者1生产了8号商品
生产者生产者2生产了9号商品
生产者生产者1生产了10号商品
消费者消费者2消费了8号商品
消费者消费者1消费了9号商品
消费者消费者2消费了10号商品

从输出内容中可以看出,生产者和消费者之间通过仓库进行线程通信,生产者不停地生产商品并放入仓库中,当仓库满时生产者进入等待状态,等待消费者消费商品后被唤醒;消费者不停地从仓库中取出商品并消费,当仓库为空时消费者进入等待状态,等待生产者生产商品后被唤醒。

以上是Java多线程之生产者消费者模式及等待唤醒机制代码详解,希望对你有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java多线程之线程通信生产者消费者模式及等待唤醒机制代码详解 - Python技术站

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

相关文章

  • Java并发编程之常用的多线程实现方式分析

    Java并发编程之常用的多线程实现方式分析 1. 前言 在 Java 程序中,多线程编程已经成为了很常见的一种编程方式,因为这能够很好地提高程序的效率。在进行 Java 多线程编程的时候,我们需要了解常用的多线程实现方式,这样才能更好地开发出高效可靠的多线程应用。本文将分析 Java 常用的多线程实现方式。 2. 继承 Thread 类 继承 Thread …

    多线程 2023年5月16日
    00
  • Python多线程与多进程相关知识总结

    Python多线程与多进程相关知识总结 多线程 多线程是指在同一进程中,多个线程并行执行不同的任务。Python提供了线程模块threading来处理多线程相关问题。线程模块允许开发商在单一进程内创建多个线程,从而最大限度地利用CPU资源。下面是一个简单的创建线程的示例代码: import threading def worker(num): "&…

    多线程 2023年5月17日
    00
  • java多线程读取多个文件的方法

    下面是详细讲解Java多线程读取多个文件的方法的完整攻略。 一、什么是多线程读取多个文件 在Java中,多线程读取多个文件指的是同时启动多个线程,每个线程读取不同的文件并进行处理,这样可以充分利用系统资源,提高读取文件的效率。 二、如何实现多线程读取多个文件 Java实现多线程读取多个文件的方法有很多,其中比较常见的方式有如下两种: 1. 使用Java Ex…

    多线程 2023年5月17日
    00
  • Java网络编程实现多线程聊天

    现在我来为您讲解如何通过Java实现多线程聊天的完整攻略。以下是详细步骤: 1. 创建服务端程序 1.1 设置端口号 在服务端程序中,你需要设置监听的端口号。可以使用一个整型变量来存储端口号,比如: int port = 8080; 1.2 创建ServerSocket 使用ServerSocket类来创建服务器套接字,同时指定端口号和等待连接队列(可以设为…

    多线程 2023年5月16日
    00
  • Python多线程入门学习

    Python多线程入门学习 多线程指的是在一个程序中同时运行多个线程,同时处理不同的任务,从而提高程序的效率。Python支持多线程编程,并且在实际应用中也十分常见。本文将介绍Python多线程编程的基本原理、注意事项以及使用场景。 什么是线程 线程是一个轻量级的执行单元,它包含了代码指针、寄存器、栈以及资源占用等等。在多线程编程中,程序会创建多个线程同时执…

    多线程 2023年5月17日
    00
  • 并发编程之Java内存模型顺序一致性

    Java内存模型顺序一致性 Java内存模型(Java Memory Model,简称JMM)是Java虚拟机规范中的一部分,它定义了Java线程如何与内存交互,以及一个线程在什么情况下才能“看到”另外线程对变量的修改。JMM中定义了一组规则来规范多线程程序的行为,其中之一就是顺序一致性。 顺序一致性 顺序一致性的含义是:如果程序中的某个操作happens-…

    多线程 2023年5月17日
    00
  • Nodejs 构建Cluster集群多线程Worker threads

    下面是详细的攻略,希望对您有帮助。 Node.js 构建 Cluster 集群 Cluster 是 Node.js 自带的库,可以简单的创建子进程。它可以实现 Node.js 应用程序的多进程负载平衡,提高应用程序的性能和可用性。 下面是使用 Cluster 模块创建 Node.js 应用程序的集群: 首先,需要判断当前环境是否为主进程。可以使用以下代码判断…

    多线程 2023年5月17日
    00
  • Java多线程死锁问题详解(wait和notify)

    Java多线程死锁问题详解(wait和notify) 在Java多线程编程中,死锁问题经常出现,而死锁问题的解决方式通常使用wait()和notify()方法,本文将详细介绍Java多线程死锁问题的解决方法。 什么是死锁? 当两个线程都持有对方需要的锁,并且都在等待对方释放锁的时候,就会出现死锁问题。举个例子,线程A持有锁a并等待锁b,线程B持有锁b并等待锁…

    多线程 2023年5月17日
    00
合作推广
合作推广
分享本页
返回顶部