多线程:简易版本生产消费者模式纯语言概述

一个消费者,一个生产者,一共就两个线程

首先用最简单的语言描述一下这个模型
对象为 资源对象,资源对象包括了生产方法,和消费方法,以及计数器
生产者对象,只会生产
消费者对象,只会销售
生产者、消费者实现了Runnable接口,同时拥有一个资源字段和为资源字段构造函数
主函数New了一个资源对象
New了一个生产者,消费者分别放入一个Thread中执行,结果很可能生产者执行一半,消费者就来执行了,为了避免这种情况为共享数据部分加入Synchronized关键字,进行同步处理
但是还有一个问题,生产者,消费者,何时运行的时机并没有确定,我们希望的是生产者生产一个,消费者消费一个。
这个时候有了实现的思路
添加一个判定Boolean标记盘子里是否有东西
首先要判断盘子里是否有东西,如果有,生产者线程暂停,
消费者进行消费,消费完毕后,唤醒生产者,修改标记为有东西。
如果没有东西生产者进行生产的时候消费,生产完毕唤醒消费者。

package hysy32.MultiThread;

/**
 * Created by 小管 on 2017/4/4.
 */
public class ShengChanXiaofeiLockDemo {
    public static void main(String[] args){
        mResource m = new mResource();
        shengchanzhe scz = new shengchanzhe(m);
        xiaofeizhe xfz = new xiaofeizhe(m);
        Thread t1 = new Thread(scz);
        Thread t2 = new Thread(xfz);
        t1.start();
        t2.start();

    }
}

class mResource {
//    Lock l = new ReentrantLock();//声明一个对象锁定
    public boolean isEmpty=true;//标记盘子是否为空

    private int count=0;//计数器

    public synchronized void shengchan() throws InterruptedException {

            if (isEmpty) {/*如果没有对象则进入生产模式*/

                count += 1;//生产+1
                System.out.println("我生产了第:" + count + "件商品");//报告生产了产品
                isEmpty=false;//改变盘子
                notify();
                //唤醒消费者

            } else {
                wait();//进入等待状态
            }

    }
    public synchronized void xiaofei() throws InterruptedException {

            if (!isEmpty) {//如果盘子非空则进入消费
                //报告消费状态
                System.out.println("我消费了第:" + count + "件商品");
                //改变盘子状态
                isEmpty = true;
                notify();//唤醒生产者
    } else {
                wait();//如果盘子是空的则休眠

    }

    }

}

class shengchanzhe implements Runnable {
    private mResource r;

    public shengchanzhe(mResource r) {
        this.r = r;
    }

    @Override
    public void run() {
        while (true) {
            try {
                r.shengchan();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

    }
}

class xiaofeizhe implements Runnable {
    private mResource r;

    xiaofeizhe(mResource r) {
        this.r = r;
    }

    @Override
    public void run() {
        while (true) {
            try {
                r.xiaofei();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

  

  

时间: 2024-10-13 08:23:41

多线程:简易版本生产消费者模式纯语言概述的相关文章

Java多线程学习笔记--生产消费者模式

实际开发中,我们经常会接触到生产消费者模型,如:Android的Looper相应handler处理UI操作,Socket通信的响应过程.数据缓冲区在文件读写应用等.强大的模型框架,鉴于本人水平有限目前水平只能膜拜,本次只能算学习笔记,为了巩固自己对Java多线程常规知识点的理解,路过大神还望能指导指导.下面一段代码是最常规的生产者消费者的例子: package com.zhanglei.demo; import java.util.ArrayList; import java.util.List

day11(多线程,唤醒机制,生产消费者模式,多线程的生命周期)

A:进程: 进程指正在运行的程序.确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能. B:线程: 线程是进程中的一个执行单元,负责当前进程中程序的执行,一个进程中至少有一个线程.一个进程中是可以有多个线程的,这个应用程序也可以称之为多线程程序. C:简而言之: 一个程序运行后至少有一个进程,一个进程中可以包含多个线程 线程实现 实现的两种方式 继承Thread public class MyThread extends Thread{ @Ove

生产消费者模式,并不是高并发模式

我为什么说生产消费者模式,并不是高并发模式?因为高并发的关键因素是数据分割,不是通信.生产消费者模式只是一个异步数据通信模式.对并发性能的提高有限. 为什么数据分割对并发性能影响这么大? 首先,我们需要说一说硬件cpu,毕竟软件最后是cpu来执行.我们的目标是让代码性能尽可能的高.更详细的表述,就是让代码最大限度的发挥cpu的性能.现在的电脑.手机都已经全部是多核cpu了.所以,表述就是让代码最大限度的发挥多核cpu的性能.最大限度的发挥多核cpu的性能,需要我们尽可能的保证代码的高并行度.高并

RabbitMQ下的生产消费者模式与订阅发布模式

??所谓模式,就是在某种场景下,一类问题及其解决方案的总结归纳.生产消费者模式与订阅发布模式是使用消息中间件时常用的两种模式,用于功能解耦和分布式系统间的消息通信,以下面两种场景为例: 数据接入 ??假设有一个用户行为采集系统,负责从App端采集用户点击行为数据.通常会将数据上报和数据处理分离开,即App端通过REST API上报数据,后端拿到数据后放入队列中就立刻返回,而数据处理则另外使用Worker从队列中取出数据来做,如下图所示. ??这样做的好处有:第一,功能分离,上报的API接口不关心

java 多线程 22 :生产者/消费者模式 进阶 利用await()/signal()实现

java多线程15 :wait()和notify() 的生产者/消费者模式 在这一章已经实现了  wait/notify 生产消费模型 利用await()/signal()实现生产者和消费者模型 一样,先定义一个缓冲区: public class ValueObject { public static String value = ""; } 换种写法,生产和消费方法放在一个类里面: public class ThreadDomain41 extends ReentrantLock {

多线程之生产者和消费者模式

package com.git.base.thread.productandconsumer; /** * 核心实现: * 生产者消费者模式: * 生产一个,消费一个,如果生产未被消费,那么就等待消费后再生产 * 如果消费后,没有下一个生产的,就等待生产后在消费 * <p>Title: DoMain.java</p> * <p>Description: </p> * <p>Copyright: Copyright (c) 2016</p&g

死锁解决方式之一生产消费者模式之信号灯法

package Tread; /** * 生产者消费者模式:信号灯法 * wait():等待,释放锁: * notify(); * wait和notify必须和sychronized一同使用: * sleep():抱着锁睡觉: * */ public class Movie { private String pic; private boolean flag = true; // 信号灯 // flag=T:生产生产,消费者等待,生产完成后通知消费: // flag=F:消费者消费,生产者等待,

多线程等待唤醒机制之生产消费者模式

上篇楼主说明了多线程中死锁产生的原因并抛出问题--死锁的解放方案,那么在本篇文章,楼主将引用一个KFC生产汉堡,顾客购买汉堡的过程来说明死锁解决方案及多线程的等待唤醒机制. 简单地用一幅图来说明KFC生产汉堡,顾客来消费的过程: 场景分析: 资源类:Hamburger 设置汉堡数据:SetThread(生产者) 获取汉堡数据:GetThread(消费者) 测试类:HamburgerTest 不同种类的线程(生产者.消费者)针对同一资源(汉堡)的操作 当汉堡有存货的时候,汉堡师傅不再生产,顾客可消

python 线程同步:生产/消费者模式

Python中的Queue对象提供了对线程同步的支持,使用queue对象可以实现多生产者和多消费者形成的先进先出的队列. 每个生产者将数据放入队列,而每个消费者依次从队列中取出数据. # coding:utf-8 import threading,time,Queue class Producer(threading.Thread):     def __init__(self,threadname):         threading.Thread.__init__(self,name=th