java简单模拟生产者消费者问题

生产者消费者问题 Java实现 生产者消费者问题 Java实现 线程同步 线程通信生产者消费者问题 Java实现 线程同步 线程通信生产者消费者问题 Java实现 线程同步 线程通信 立即下载

本文来自:http://www.cnblogs.com/happyPawpaw/archive/2013/01/18/2865957.html

引言

  生产者和消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一个存储空间,如下图所示,生产者向空间里存放数据,而消费者取用数据,如果不加以协调可能会出现以下情况:

  存储空间已满,而生产者占用着它,消费者等着生产者让出空间从而去除产品,生产者等着消费者消费产品,从而向空间中添加产品。互相等待,从而发生死锁。

JAVA解决线程模型的三种方式

  1、wait()和notify()

复制代码
import java.util.LinkedList;

public class ProducerConsumer {
    private LinkedList<Object> storeHouse = new LinkedList<Object>();
    private int MAX = 10;

    public ProducerConsumer() {
    }

    public void start() {
        new Producer().start();
        new Comsumer().start();
    }

    class Producer extends Thread {
        public void run() {
            while (true) {
                synchronized (storeHouse) {
                    try {
                        while (storeHouse.size() == MAX) {
                            System.out.println("storeHouse is full , please wait");
                            storeHouse.wait();
                        }
                        Object newOb = new Object();
                        if (storeHouse.add(newOb)) {
                            System.out.println("Producer put a Object to storeHouse");
                            Thread.sleep((long) (Math.random() * 3000));
                            storeHouse.notify();
                        }
                    } catch (InterruptedException ie) {
                        System.out.println("producer is interrupted!");
                    }

                }
            }
        }
    }

    class Comsumer extends Thread {
        public void run() {
            while (true) {
                synchronized (storeHouse) {
                    try {
                        while (storeHouse.size() == 0) {
                            System.out.println("storeHouse is empty , please wait");
                            storeHouse.wait();
                        }
                        storeHouse.removeLast();
                        System.out.println("Comsumer get  a Object from storeHouse");
                        Thread.sleep((long) (Math.random() * 3000));
                        storeHouse.notify();
                    } catch (InterruptedException ie) {
                        System.out.println("Consumer is interrupted");
                    }

                }
            }

        }
    }

    public static void main(String[] args) throws Exception {
        ProducerConsumer pc = new ProducerConsumer();
        pc.start();
    }
}
复制代码

 

  2、await()和signal(),即线程锁的方式

复制代码
package sort;

import java.util.LinkedList;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class ProducerConsumer {
    private LinkedList<Object> myList = new LinkedList<Object>();
    private int MAX = 10;
    private final Lock lock = new ReentrantLock();
    private final Condition full = lock.newCondition();
    private final Condition empty = lock.newCondition();

    public ProducerConsumer() {
    }

    public void start() {
        new Producer().start();
        new Consumer().start();
    }

    public static void main(String[] args) throws Exception {
        ProducerConsumer s2 = new ProducerConsumer();
        s2.start();
    }

    class Producer extends Thread {
        public void run() {
            while (true) {
                lock.lock();
                try {
                    while (myList.size() == MAX) {
                        System.out.println("warning: it's full!");
                        full.await();
                    }
                    Object o = new Object();
                    if (myList.add(o)) {
                        System.out.println("Producer: " + o);
                        empty.signal();
                    }
                } catch (InterruptedException ie) {
                    System.out.println("producer is interrupted!");
                } finally {
                    lock.unlock();
                }
            }
        }
    }

    class Consumer extends Thread {
        public void run() {
            while (true) {
                lock.lock();
                try {
                    while (myList.size() == 0) {
                        System.out.println("warning: it's empty!");
                        empty.await();
                    }
                    Object o = myList.removeLast();
                    System.out.println("Consumer: " + o);
                    full.signal();
                } catch (InterruptedException ie) {
                    System.out.println("consumer is interrupted!");
                } finally {
                    lock.unlock();
                }
            }
        }
    }

}
复制代码

 

  3、阻塞队列的方式

复制代码
import java.util.concurrent.*;

public class ProducerConsumer {
    // 建立一个阻塞队列
    private LinkedBlockingQueue<Object> queue = new LinkedBlockingQueue<Object>(10);

    public ProducerConsumer() {
    }

    public void start() {
        new Producer().start();
        new Consumer().start();
    }

    public static void main(String[] args) throws Exception {
        ProducerConsumer s3 = new ProducerConsumer();
        s3.start();
    }

    class Producer extends Thread {
        public void run() {
            while (true) {
                try {
                    Object o = new Object();
                    // 取出一个对象
                    queue.put(o);
                    System.out.println("Producer: " + o);
                } catch (InterruptedException e) {
                    System.out.println("producer is interrupted!");
                }
                // }
            }
        }
    }

    class Consumer extends Thread {
        public void run() {
            while (true) {
                try {
                    // 取出一个对象
                    Object o = queue.take();
                    System.out.println("Consumer: " + o);
                } catch (InterruptedException e) {
                    System.out.println("producer is interrupted!");
                }
                // }
            }
        }
    }

}
复制代码

结论

  三种方式原理一致,都是对独占空间加锁,阻塞和唤醒线程,第一种方式比较传统,第三种方式最简单,只需存储和取用,线程同步的操作交由LinkedBlockingQueue全权处理。

SAP开发实战:用FI_DOCUMENT_CHANGE BAPI批量修改FB03凭证抬头和行项目文本(附完整ABAP代码) 本文详细介绍了如何使用SAP的FI_DOCUMENT_CHANGE BAPI批量修改FB03凭证抬头和行项目文本,提供完整的ABAP代码实现方案。通过该BAPI,开发者可以高效完成财务凭证的批量修改,确保数据一致性和审计合规性,显著提升SAP财务模块的运维效率。 阅读详情

相关推荐

oracle p6 破解版下载,Primavera P6项目管理软件 16~17 图文详细安装教程(附下载)

Primavera P6 Professional项目管理软件结合了Oracle和Microsoft SQL Server关系数据库,是一款非常好用且功能强大的综合的项目管理软件(PPM) 解决方案,主要用于土建等方面的施工计划分析,具有进度时间安排与资源控制功能的多用户、多项目系统,支持多层项目分层结构、角色与技能导向的资源安排、记录实际数据、自定义视图以及自定义数据,本文主要为大家图文详细介绍...

weixin_33978451的博客 4918

Java实现生产者消费者问题

生产者-消费者问题是计算机科学中经典的同步问题之一,它描述了多个线程在共享数据的情况下如何协同工作。该问题通常涉及到一个共享缓冲区,其中生产者线程生成数据并将其放入缓冲区,而消费者线程从缓冲区中取出数据并对其进行处理。生产者和消费者线程必须协同工作,以避免竞态条件和死锁等问题。以上为通过Java代码实现解决生产消费者问题的实例,通过本实例希望大家能学会如果解决此问题,学会如何数据共享时,各个线程协同工作。

无简介 6118

实施文档

流程管理 2008-04-23 09:44:00 874 收藏 3 分类专栏: 企业管理杂谈 文章标签: 文档 文档管理 项目管理 工作 配置管理 工具 项目实施文档是用来记录、描述、展示实施过程中一系列信息的处理过程,通过书面或图示的形式对项目活动过程或结果进行描述、定义、规定及报告。例如分阶段实施计划文档,标准业务流程文档,标准编码及数据文档,标准参数设置文档,功能操作指南文档。这些文档将会伴随着ERP实施的各个阶段逐渐充实、完善,也同时记载了整个实施的过程和成果。 作为实施顾问人员,在实施过程

qq_52337172的博客 1062

Java多种方式解决生产者消费者问题

参考: Java多种方式解决生产者消费者问题(十分详细) 一 、 synchronized + wait() / notify()方法 当缓冲区已满时,生产者线程停止执行,放弃锁,使自己处于等状态,让其他线程执行; 当缓冲区已空时,消费者线程停止执行,放弃锁,使自己处于等状态,让其他线程执行。 当生产者向缓冲区放入一个产品时,向其他等待的线程发出可执行的通知,同时放弃锁,使自己处于等待状态; 当消费者从缓冲区取出一个产品时,向其他等待的线程发出可执行的通知,同时放弃锁,使自己处于等待状态。

火星男孩的分享空间 696

Python实战:5分钟搞定固定翼无人机三自由度仿真(附完整代码)

本文提供了一个基于Python的固定翼无人机三自由度仿真快速实现方案。通过面向对象设计,封装了核心运动学模型,并对比了欧拉法与龙格-库塔法两种积分方法。文章附有完整实例代码,帮助算法工程师和研究人员在5分钟内搭建轻量级仿真环境,用于快速验证控制律、路径规划等核心算法逻辑。

docker7nomad的博客 749

生产者-消费者问题-Java实现

OS 生产者消费者的JAVA实现

weixin_47227871的博客 1576

Mellanox CX7网卡搭配400G光模块实战:从选型到部署的完整指南

本文详细解析了Mellanox CX7网卡与400G光模块的选型策略与部署实践,涵盖硬件对比、兼容性验证及性能调优。重点介绍了OSFP光模块的选择要点和常见问题排查方法,帮助用户构建高性能网络基础设施,适用于AI训练、金融交易等场景。

efc1234567的博客 1291

java篇37-java的生产者消费者代码实现(使用wait()、notify()、notifyAll())、阻塞队列实现

可以看到,运行结果显示阻塞队列大小为1,生产者却可以连续生产,其实并不是这样。出现这种状况的原因如下图,生产者放产品和打印输出语句并不一定一次性执行完,由于多个线程并发执行导致这种错觉。阻塞队列相当于连接生产者和消费者之间的通道,相当于缓冲池,可以理解为缓冲区大小大于1,且是一个队列。例如,设生产者消费者问题中的缓冲池大小为1。接口不能直接定义对象,需要用上图中两个蓝色框中的两个实现类定义阻塞队列的对象。生产者消费者问题也是等待唤醒机制,是一个十分经典的多线程协作的模式。二、阻塞队列实现等待唤醒机制。

qq_51476492的博客 1285

GEE数据融合——Landsat (collection 2,level 2 )4、5、7、8、9长时间序列影像数据融合和视频导出分析

长时间序列影像数据融合是指将Landsat影像数据集合2级2(Level 2)中的4、5、7、8和9这五个卫星的数据进行融合。具体来说,这包括将同一地点的多个卫星影像数据进行处理和整合,以产生一个单一的、具有更高质量的影像产品。在长时间序列影像数据融合中,首先需要对不同卫星的影像数据进行校正,以消除不同卫星之间的光谱差异、辐射度问题和几何纠正误差等。然后,通过使用融合算法,将多个卫星的影像数据进行组合,以生成一张全新的、高质量的合成影像。

此星光明博客 1734

【图像超分】论文复现:Pytorch实现SRCNN!保姆级复现教程!提供完整代码和最优权重模型(x2、x3、x4)!科研级论文曲线图!计算平均PSNR和SSIM!代码Windows和Linux都可用!

由于很多同学反应没用过jupyter notebook,更习惯用pycharm项目的形式跑代码。于是,本文将用pycharm项目的形式,重新复现SRCNN!【图像超分】论文复现:新手入门!Pytorch实现SRCNN,数据预处理、模型训练、测试、评估全流程详解,注释详细,简单修改就可以训练你自己的图像数据,有训练好的模型下载地址,随取随用。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 4703

Java代码解决生产者--消费者问题

生产者线程在循环中检查缓冲区是否已满,如果已满则调用buffer.wait()进入等待状态,否则将产品添加到缓冲区,并通过buffer.notifyAll()通知消费者线程可以消费了。消费者线程在循环中检查缓冲区是否为空,如果为空则调用buffer.wait()进入等待状态,否则从缓冲区中取出产品,并通过buffer.notifyAll()通知生产者线程可以生产了。这两个类都实现了Runnable接口,并在run()方法中定义了线程的执行逻辑。然后创建生产者和消费者线程,并启动它们。

wzxue1984的博客 614

一文读懂5G网络整体架构(接入网+承载网+核心网)

接入网重构分级(分工更细、效率更高)、承载网三段化升级(管道更宽、更智能)、核心网服务化云化(管理更灵活、成本更低)最终实现“成本最优、资源灵活、场景适配”,才能支撑自动驾驶、工业互联网、智慧城市、VR/AR等各种新场景,真正走进我们的生活。

鲸落寰宇 429

java多线程之生产者与消费者问题的简单模拟

//临界资源类class Resource{ private String products[]; int empty,full; int in, out;     public Resource(){     products = new String[10];        empty = 10;        full = 0;     in = 0;     out = 0;    }  

984

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

生产者-消费者模型详解

生产者-消费者模式是多线程编程中常见的一种模式,它用于解决生产者和消费者之间的协作问题。生产者负责生成数据,消费者负责处理数据,通过合理的协作,可以实现高效的数据处理。本文将详细介绍 Java 生产者-消费者模式,包括其基本概念、常见用法以及注意事项。

qq_65501447的博客 1636

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

生产者消费者模型

生产者消费者模型 生产者消费者模型是通过一个容器来解决生产者和消费者的强耦合问题。 生产者与消费者彼此之间不直接通讯,而是通过阻塞队列来进行通讯,所以生产者生产完数据之后不会等待消费者处理,直接扔给阻塞队列 同时消费者直接从阻塞队列里取数据,阻塞队列就相当于一个缓冲区,平衡生产者与消费者的数据处理能力 先来复习一下可以用到的一个重要方法 1、wait()-痴汉方法 wait()就是使线程停止运行,...

vm04580 333

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

java多线程模拟生产者消费者问题,公司面试常常问的题。。。

package com.cn.test3; //java多线程模拟生产者消费者问题 //ProducerConsumer是主类,Producer生产者,Consumer消费者,Product产品 //Storage仓库//批注:我把输出结果写在程序以下了,你能够看一下,事实上非常easy的,你想象一下产品从生产,到取出的一个生产线,我们定义两个线程,生产者线程,和消费者线程,一个是生产...

weixin_30894389的博客 85

java解决单缓冲生产者消费者问题示例

经典的生产者消费者问题模拟。此程序模拟最简单情形——单缓冲。为模拟实际情况,consume item和produce item时加了延时,可以通过修改延时模拟不同的生成消费速率。   [code]   [/co/**   * single buffer consumer-producer problem.   * by xu(xusiwei1236@163.com).   * */  

svqd0210lh的专栏 427

设计模式-生产者消费者模型

在介绍生产消费者模型之前,我们先认识一下阻塞队列。阻塞队列是一种支持阻塞操作的队列,常用于,它提供了线程安全的队列操作,并且在队列为空或满时,能够阻塞等待,直到条件满足时。阻塞队列:是一种更为复杂的队列,和之前学的队列有些相似。阻塞队列的特点:阻塞队列是线程安全的当队列为空时,尝试出队列,出队列操作就会形成阻塞,直到添加元素为止。当队列为满时,尝试入队列,入队列操作就会形成阻塞,直到其他线程取走元素为止。

2301_80235470的博客 1035

多线程---生产者与消费者

class Consumer implements Runnable {  private Storage storage;  public Consumer(Storage storage) {   this.storage = storage;  }  @Override  public void run() {   for (int i = 0; i    storage.pop();

ˉ夨落旳尐孩的专栏 873

黑马程序员——多个生产者,多个消费者 notifyAll() 方式二

----------------------    android培训    java培训   期待与您交流!    ----------------------                             package thread; public class Procedure_Customer_Up{ public static void main(String

知识搬运工,资料任你拿,包括书籍、电影、电视剧、网站、软件等,VX公人人人号:向前书局 997

java多线程 生产者 消费者

/* 每一个对象除了有一个锁之外,还有一个等待队列(wait set),当一个对象刚创建的时候,它的对待队列是空的。 我们应该在当前线程锁住对象的锁后,去调用该对象的wait方法。 也就是在同步快 或者同步函数中调用  wait  对于生产者消费者问题应该在同一个对象的等待队列中 当调用对象的notify方法时,将从该对象的等待队列中删除一个任意选择的线程,这个线程将再次成为可运行的线...

feipigwang 103

java生产者和消费者问题之售票实现方法

/** * 代码注释很详细: * 生产者与消费者的问题产生于共用一个对象,在一个时刻对象只能供两者之间的一个调用(加锁) * 通过判断通过设置的判断量来进行程序的控制。 * */public class TestThread { public static void main(String[] args) { Tickets t = new Tickets(10)

April 981

利用记录型信号量机制实现生产者-消费者问题_程序员:Java并发编程(JUC)模拟AND型信号量...

AND型信号量可能大家都听说过并可能都有一定的理解,但是你有使用过么?今天就使用Java来模拟实现!​ 本文是对上篇文章(进程同步机制)的一次实践,通过JUC提供的一些机制来模拟一些OS中的AND型信号量,因为记录型型信号量可以等价于JUC中提供的Semaphore(信号量),但是对于AND型信号量因为一些原因(主要是过时了),JUC没有提供,今天就手动的来写一个AND型信号量对应的Swait操作...

weixin_31966453的博客 794

面试-----手写生产者消费者

代码是copy的 ,忘了网址 import java.util.ArrayList; import java.util.List; /** * Created with IDEA. * User:haibo. * DATE:2018/7/22/022 */ public class Shop { List&lt;String&gt; data = new ArrayList...

lettyisme的博客 1468

操作系统的收银员与顾客问题 java代码实现

操作系统收银员与顾客问题 java代码实现

weixin_44892327的博客 659
上一篇: Java 6 JVM参数选项大全(中文版)
下一篇: 云计算的三种服务模式:SaaS/PaaS/IaaS
天魂地煞
博客等级 码龄15年 18粉丝 36原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值