首页 > 编程语言 >Java练习(并发模式)

Java练习(并发模式)

时间:2024-05-23 21:55:36浏览次数:16  
标签:Java Producer 生产者 练习 queue 并发 缓冲区 Consumer public

设计一个简单的生产者-消费者模型,其中生产者负责生成数据,消费者负责处理数据。为了在生产者和消费者之间传递数据,使用一个有界缓冲区(例如,`ArrayBlockingQueue`)作为它们之间的通信通道。

要求:

1. 创建一个`Producer`类,该类包含一个`produce()`方法,用于生成数据。生成的数据应该是一个整数,范围在1到100之间。
2. 创建一个`Consumer`类,该类包含一个`consume()`方法,用于处理数据。处理数据的方式是将接收到的整数打印到控制台。
3. 在`main`方法中,创建一个`ArrayBlockingQueue`实例作为缓冲区,以及一个`Producer`和一个`Consumer`实例。然后,创建两个线程,一个用于执行生产者的`produce()`方法,另一个用于执行消费者的`consume()`方法。
4. 生产者应该不断地生成数据并将其放入缓冲区,直到缓冲区满为止。当缓冲区满时,生产者应该等待消费者处理数据并释放空间。
5. 消费者应该不断地从缓冲区中取出数据并处理,直到缓冲区为空为止。当缓冲区为空时,消费者应该等待生产者生成数据。
 

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

// 定义Producer类
class Producer {
    private final BlockingQueue<Integer> queue;

    public Producer(BlockingQueue<Integer> queue) {
        this.queue = queue;
    }

    public void produce() {
        try {
            int data = (int) (Math.random() * 100) + 1;
            queue.put(data);
            System.out.println("生产者生成数据: " + data);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

// 定义Consumer类
class Consumer {
    private final BlockingQueue<Integer> queue;

    public Consumer(BlockingQueue<Integer> queue) {
        this.queue = queue;
    }

    public void consume() {
        try {
            int data = queue.take();
            System.out.println("消费者处理数据: " + data);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

// 主类
public class Main {
    public static void main(String[] args) {
        // 创建一个有界缓冲区
        BlockingQueue<Integer> queue = new ArrayBlockingQueue<>(10);

        // 创建生产者和消费者实例
        Producer producer = new Producer(queue);
        Consumer consumer = new Consumer(queue);

        // 创建线程执行生产者和消费者的方法
        Thread producerThread = new Thread(() -> {
            while (true) {
                producer.produce();
                if (queue.size() >= queue.remainingCapacity()) {
                    break;
                }
            }
        });

        Thread consumerThread = new Thread(() -> {
            while (true) {
                consumer.consume();
                if (queue.isEmpty()) {
                    break;
                }
            }
        });

        // 启动线程
        producerThread.start();
        consumerThread.start();
    }
}

标签:Java,Producer,生产者,练习,queue,并发,缓冲区,Consumer,public
From: https://blog.csdn.net/2301_79600015/article/details/139103245

相关文章

  • Java 形参 实参 参数传递
    Java形参实参在Java中,形参和实参是两个重要的概念,它们分别指形式参数和实际参数。形参:形式参数是在方法定义时用于接收调用该方法时传递的参数。它只在方法内部有效,方法结束后就消失了。实参:实际参数是在调用方法时传递给方法的参数,它可以是常量、变量、表达式、或者方法的......
  • 框架(Java相关)基础
    框架前置知识时间:2024-05-20星期一学习内容Maven构建工具Maven的核心特性Maven的依赖管理Maven的工程打包工厂模式设计模式工厂模式工厂模式的引用场景反射机制反射及作用反射的四个核心类反射在项目中的应用Lambda表达式Lamb......
  • 计算机Java项目|基于springboot的网上购物商城系统研发
    作者主页:编程指南针作者简介:Java领域优质创作者、CSDN博客专家、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、腾讯课堂常驻讲师主要内容:Java项目、Python项目、前端项目、人工智能与大数据、简历模板、学习资料、面试题库、技术互......
  • 计算机Java项目|基于Springboot甘肃非物质文化网站的设计与开发
    作者主页:编程指南针作者简介:Java领域优质创作者、CSDN博客专家、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、腾讯课堂常驻讲师主要内容:Java项目、Python项目、前端项目、人工智能与大数据、简历模板、学习资料、面试题库、技术互......
  • 计算机Java项目|Springboot教师工作量管理系统
    作者主页:编程指南针作者简介:Java领域优质创作者、CSDN博客专家、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、腾讯课堂常驻讲师主要内容:Java项目、Python项目、前端项目、人工智能与大数据、简历模板、学习资料、面试题库、技术互......
  • 【Java学习】第19节:时间类(Date、Calendar、SimpleDateFormat)、包装类
    目录第一章Date类1.1Date概述1.2Date常用方法第二章SimpleDateFormat类2.1构造方法2.2格式规则2.3常用方法2.4练习1(初恋女友的出生日期)2.5练习2(秒杀活动)第三章Calendar类3.1概述3.2常用方法3.3get方法示例3.4set方法示例:3.5add方法示例:第......
  • js逆向系列1.1、JavaScript基础语法
    JS逆向爬虫语法初阶dy:a_b,xhs:x-s等有需要联系。v:a2247429407【1】JavaScript初识JavaScript是一种用于在客户端(即用户的浏览器)上运行的编程语言。它是一种脚本语言,可以直接嵌入到HTML页面中,并由浏览器解释和执行。在客户端环境中,JavaScript可以与用户交互,操作和修......
  • [Java]Socket套接字(网络编程入门)
    【版权声明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权)https://www.cnblogs.com/cnb-yuchen/p/18032037出自【进步*于辰的博客】参考笔记二,P61。注:“一对一”、“多对多”是相对于Socket而言,而非服务端/客户端类的个数。目录1、概述2、二种聊天模式2.1“一对一......
  • DdddOcr 带带弟弟OCR通用验证码和 JAVA调用
    本文主要参考DdddOcr发布的最新版本启动服务端,以及JAVA如何和服务端对接。DdddOcr,其由作者与kerlomz共同合作完成,通过大批量生成随机数据后进行深度网络训练,本身并非针对任何一家验证码厂商而制作,本库使用效果完全靠玄学,可能可以识别,可能不能识别。DdddOcr、最简依赖......
  • 【补充】进程理论:开设多进程的方式、多进程实现服务端并发、join实现并发
    【补充】进程理论【一】开设多进程的两种方式【1】在Windows上启动子进程#必须将启动入口放到if__name__=='__main__':'''由于Windows没有fork,多处理模块启动一个新的Python进程并导入调用模块。如果在导入时调用Process(),那么这将启动无限继承的新进程(或直到机器耗尽资......