返回顶部
首页 > 资讯 > 精选 >Java多线程中消费者与生产者的关系是什么
  • 826
分享到

Java多线程中消费者与生产者的关系是什么

2023-06-02 12:06:06 826人浏览 八月长安
摘要

这篇文章将为大家详细讲解有关Java多线程中消费者与生产者的关系是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。  多线程:CPU中各种任务在交替执行过程中,被称为多线程处理。其中,每个任务的一次动态

这篇文章将为大家详细讲解有关Java多线程中消费者与生产者的关系是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

  多线程:CPU中各种任务在交替执行过程中,被称为多线程处理。其中,每个任务的一次动态执行过程被称为进程。进程执行过程中的暂停被称为中断。进程通过中断被分解成若干段,每一段被称为一个线程。

  在消费者与生产者中,我们设定单个生产者的每次活动是馒头 +1;单个消费者每次进行的是馒头 -1;然后消费者和生产者的活动时间不确定,同时生产者和消费者的数量不确定,该经典问题我们使用多线程实现:

  我们首先确定实物,即生产者的每次生成的物品,在这里我们使用馒头代替。在WoTou的类中,我们可以看到有着自己独特的属性,即馒头的 id,我们可以在控制台清晰的看到馒头的生产和消费过程,具体实现代码如下:

  class WoTou{ //馒头,生产者生产的馒头

  int id;

  WoTou(int id){

  this.id = id;

  }

  public String toString(){

  return "WoTou:"+ id;

  }

  }

  我们需要确定馒头的存储容器,即在消费和生产发生的时候,我们需要在什么地方进行判断,馒头是否耗尽,或者馒头是否满溢。每次活动都是相当于在栈中取东西和放东西,所以我们根据栈的特性为:先进后出 原则。

  class SyncStack {//篮子容器,放馒头用的

  int index = 0;

  WoTou[] arrWT = new WoTou[6];

  }

  在篮子容器中我们简单定义栈的最大容量为6,我们之后设定生产者的类,定义为producer类。我们知道producer有着一些自己的独特属性,即往篮子SyncStack中放WoTou,每次进行馒头+1操作,还有生产者的操作Time间隔,是隔10毫秒还是5毫秒,我们使得producer类实现其Runnerable接口,调用线程的run()方法,具体代码如下:

  class Producer implements Runnable{ //生产者

  SyncStack ss= null;

  Producer(SyncStack ss){

  this.ss = ss;

  }

  public void run(){

  for(int i=0;i<20;i++){

  WoTou wt = new WoTou(i);

  ss.push(wt);

  System.out.println("生产者:"+wt);

  try {

  Thread.sleep((int)(Math.random()*1000));

  } catch (InterruptedException e) {

  // TODO: handle exception

  e.printStackTrace();

  }

  }

  }

  }

  生产者在往栈中添加数据的时候,我们使用push方法进行插入。同时定义插入的馒头数量,这里的数量并不是篮子的馒头数量。篮子里边虽然只能一次性装6个馒头,但是消费者是同时间进行操作的,所以篮子的馒头数量在消费之后,生产者继续进行生产,一直到生产20个馒头为止。

  消费者我们这里定义为Consumer类,消费者和生产者有一定的相似性,但是我们需要消费在篮子中拿的过程,我们使用pop操作,同时定义消费数量,以及操作间隔,这里都是使用线程的sleep(时间)方法, 代码如下:

  class Consumer implements Runnable{ //消费者

  SyncStack ss= null;

  Consumer(SyncStack ss){

  this.ss = ss;

  }

  public void run(){

  for(int i=0;i<20;i++){

  WoTou wt = ss.pop();

  System.out.println("消费量:"+wt);

  try {

  Thread.sleep((int)(Math.random()*1000));

  } catch (InterruptedException e) {

  // TODO: handle exception

  e.printStackTrace();

  }

  }

  }

  }

  最后我们考虑在篮子中,假如容量已满,即生产者生产过多,消费的太慢,那么生产者需要休息;同样的消费过快,容器数量为0,消费者开始休息。我们在两种情况发生的时候,需要设置两种方法,在极限情况发生的时候,进行判断。简单实现代码如下:

  public synchronized void push(WoTou wt){ //往篮子中放馒头

  while(index == arrWT.length){

  try {

  this.wait();

  } catch (InterruptedException e) {

  // TODO: handle exception

  e.printStackTrace();

  }

  }

  this.notify();

  arrWT[index] = wt;

  index++;

  }郑州人流多少钱 Http://mobile.sgyy029.com/

  我们需要确定是我们在生产者进行活动的时候,不能受到其他线程的影响,即我们需要保持在某一时刻只有一个线程进行操作,这种情况我们需要使用线程的一个synchronized方法。这个方法称为死,锁定当前方法体执行的过程中,保持其独立性。即在方法体的前面使用synchronized关键字修饰。

  从篮子中取出馒头的操作类似于生产者,实现代码如下:

  public synchronized WoTou pop(){ //从篮子中取馒头

  while(index == 0){

  try {

  this.wait();

  } catch (InterruptedException e) {

  // TODO: handle exception

  e.printStackTrace();

  }

  }

  this.notify();

  index--;

  return arrWT[index];

  }

  我们会发现在上面两种动作中,考虑到一个问题,即数量到极限之后,我们的动作停止了。生产者在篮子容量到达6时,动作停止;消费者在篮子数量到0后,停止行为。我们这时候开始使用线程的notify方法,唤醒休眠的线程,因为线程使用了wait方法,我们可以唤醒之后,在进行各自的行为。因此篮子SynStack类中详细代码为:

  class SyncStack {//篮子容器,放馒头用的

  int index = 0;

  WoTou[] arrWT = new WoTou[6];

  public synchronized void push(WoTou wt){ //往篮子中放馒头

  while(index == arrWT.length){

  try {

  this.wait(); //线程等待

  } catch (InterruptedException e) {

  // TODO: handle exception

  e.printStackTrace();

  }

  }

  this.notify(); //唤醒wait的线程

  arrWT[index] = wt;

  index++;

  }

  public synchronized WoTou pop(){ //从篮子中取馒头

  while(index == 0){

  try {

  this.wait();

  } catch (InterruptedException e) {

  // TODO: handle exception

  e.printStackTrace();

  }

  }

  this.notify();

  index--;

  return arrWT[index];

  }

  }

  我们可以修改生产者和消费者的数量和操作间隔,不一定生产+1同时消费-1。我们可以根据修改进行更改代码,上面的运行在控制台数据

关于“Java多线程中消费者与生产者的关系是什么”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

--结束END--

本文标题: Java多线程中消费者与生产者的关系是什么

本文链接: https://lsjlt.com/news/230156.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Java多线程中消费者与生产者的关系是什么
    这篇文章将为大家详细讲解有关Java多线程中消费者与生产者的关系是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。  多线程:CPU中各种任务在交替执行过程中,被称为多线程处理。其中,每个任务的一次动态...
    99+
    2023-06-02
  • Java多线程:生产者与消费者案例
    目录前言工具知识点设计思路具体步骤总结前言 想象一下生活中哪些是和线程沾边的?饭店炒菜就是一个很好的例子 首先客人要吃菜,前提是厨师要炒好,也就是说,厨师不炒好的话客人是没有饭菜的。...
    99+
    2024-04-02
  • Java多线程中的生产者与消费者案例讲解
    这篇文章主要讲解了“Java多线程中的生产者与消费者案例讲解”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java多线程中的生产者与消费者案例讲解”吧!目录前言工具知识点设计思路具体步骤总结...
    99+
    2023-06-20
  • 生产者与消费者+Queue(线程安全)
    from queue import Queue from lxml import etree import requests from urllib import request from threading import Thread...
    99+
    2023-01-30
    生产者 线程 消费者
  • Java多线程中消费者生产者模式怎么实现
    这篇文章主要讲解了“Java多线程中消费者生产者模式怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java多线程中消费者生产者模式怎么实现”吧!  //主类&nb...
    99+
    2023-06-17
  • Java线程通信中关于生产者与消费者案例分析
    相关方法: wait():一旦执行此方法,当前线程就进入阻塞状态,并释放同步监视器。 notify():一旦执行此方法,就会唤醒被wait的一个线程,如果有多个线程被wait,就唤醒...
    99+
    2024-04-02
  • Java多线程之生产者消费者模式详解
    目录1.生产者消费者模型2.实现生产者消费者模型3.生产者消费者模型的作用是什么总结问题: 1.什么是阻塞队列?如何使用阻塞队列来实现生产者-消费者模型? 2. 生产者消费者模型的作...
    99+
    2024-04-02
  • java 中多线程生产者消费者问题详细介绍
    java 中多线程生产者消费者问题前言:一般面试喜欢问些线程的问题,较基础的问题无非就是死锁,生产者消费者问题,线程同步等等,在前面的文章有写过死锁,这里就说下多生产多消费的问题了import java.util.concurrent.lo...
    99+
    2023-05-31
    java 多线程 ava
  • Java中的生产者/消费者模型
    一、什么是生产者/消费者模型 生产者-消费者模型(Producer-Consumer problem)是一个非常经典的多线程并发协作的模型。 比如某个模块负责生产数据,而另一个模块负责处理数据。产生数据的模块就形象地被称为生产者;而处理数据...
    99+
    2023-10-05
    java 多线程 wait notify notifyAll
  • Kafka中生产者和消费者指的是什么
    在Kafka中,生产者和消费者是指Kafka消息系统中参与消息传递的两种角色。 生产者是指负责向Kafka集群中的主题(topic)...
    99+
    2024-03-14
    Kafka
  • JAVA项目中的生产者消费者如何利用多线程实现
    今天就跟大家聊聊有关JAVA项目中的生产者消费者如何利用多线程实现,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。JAVA多线程实现生产者消费者的实例详解Product.Javapac...
    99+
    2023-05-31
    java 多线程 ava
  • java 中怎么实现生产者消费者
    今天就跟大家聊聊有关java 中怎么实现生产者消费者,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。生产者消费者图存储空间已满,而生产者占用着它,消费者等着生产者让出空间从而去除产品,...
    99+
    2023-06-17
  • Python中怎么利用多线程实现生产者消费者模式
    Python中怎么利用多线程实现生产者消费者模式,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。什么是生产者消费者模式在软件开发的过程中,经常碰到这样的场景:某些模块负责生产数据...
    99+
    2023-06-17
  • Java实现生产者消费者的两种方式分别是什么
    本篇文章给大家分享的是有关Java实现生产者消费者的两种方式分别是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。   我在8年前去面试程序员的时候,一个...
    99+
    2023-06-03
  • python多进程中的生产者和消费者模型怎么实现
    这篇文章主要介绍了python多进程中的生产者和消费者模型怎么实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇python多进程中的生产者和消费者模型怎么实现文章都会有所收获,下面我们一起来看看吧。Pytho...
    99+
    2023-07-05
  • Java编程生产者消费者实现的四种方法
    目录实现生产者消费者的四种方式一、最基础的二、java.util.concurrent.lock 中的 Lock 框架三、阻塞队列BlockingQueue的实现Blockqueue...
    99+
    2024-04-02
  • Java实现生产者消费者问题与读者写者问题的示例分析
    这篇文章将为大家详细讲解有关Java实现生产者消费者问题与读者写者问题的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1、生产者消费者问题生产者消费者问题是研究多线程程序时绕不开的经典问题之一,它...
    99+
    2023-05-30
    java
  • Python生产者与消费者模型中的优势有哪些
    这篇文章主要介绍“Python生产者与消费者模型中的优势有哪些”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Python生产者与消费者模型中的优势有哪些”文章能帮助大家解决问题。生产者消费者模型具体...
    99+
    2023-07-05
  • Docker启动RabbitMQ实现生产者与消费者的详细过程
    目录一、Docker拉取镜像并启动RabbitMQ二、Hello World(一)依赖导入(二)消息生产者(三)消息消费者三、实现轮训分发消息(一)抽取工具类(二)启动两个工作线程(...
    99+
    2023-02-23
    Docker启动RabbitMQ Docker 生产者与消费者
  • Java多线程之线程通信生产者消费者模式及等待唤醒机制代码详解
    前言前面的例子都是多个线程在做相同的操作,比如4个线程都对共享数据做tickets–操作。大多情况下,程序中需要不同的线程做不同的事,比如一个线程对共享变量做tickets++操作,另一个线程对共享变量做tickets–操作,这就是大名鼎鼎...
    99+
    2023-05-30
    java 多线程 ava
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作