/**
* 2019年8月8日17:42:23
* 目的:Java多线程实现生产与消费
* @author 张涛
*
* 多态:
* 一个父类的引用既可以指向父类对象
* 也可以指向子类对象
* 它会根据当前时刻指向的不同
* 自动调用该对象里面的属性和方法
*
* this:
* this在构造方法中表示正在构造的对象
* this在一般方法中表示正在调用的对象
*/ //构建栈(杯子)类
class synstack
{
//数组相当于货架,每次只能放入6个
char[] data = new char[6]; //数组当前有效元素个数
int cnt = 0; //生产方法
public synchronized void push(char ch)
{
//每一次都要判断货架是否满了,如果满了,就wait,唤醒另一个进程
while(cnt == data.length)
{
//异常处理,wait属于必须要捕获的异常
try
{
this.wait();
}
catch(Exception e)
{
//可以不做任何处理
}
}
//唤醒另一个进程
this.notify(); //讲数据以压栈的方式存入货架
data[cnt] = ch; //有效个数自增
cnt++; System.out.printf("第%d个产品已经生产好,该产品为%c\n",cnt,ch);
} //消费方法
public synchronized char pop()
{
//定义货物
char ch = 0; //每一次都要检查是否已经把杯子里的货物消费完
//如果消费完了,则进入等待状态,唤醒另一个进程
while(cnt == 0)
{
//wait属于必须要捕获的异常
try
{
this.wait();
}
catch(Exception e)
{
//可以不做任何处理
}
} //唤醒另一个进程
this.notify(); //把货物消费掉
cnt--;
ch = data[cnt];
System.out.printf("正在消费掉第%d个货物,该货物为%c\n",cnt+1,ch);
return ch;
}
} //生产类
class producer implements Runnable
{
//定义父类的引用,私有的原因是不想任意修改父类引用的指向
public synstack ss = null; //构造方法,通过多态实现指向的不同,从而达到调用内部方法的作用
public producer(synstack ss)
{
this.ss = ss;
} //重写run方法,以用来实现输入
public void run()
{
char ch = 0;
for(int i=0; i<26; i++)
{
ch =(char) ('a' + i);
ss.push(ch);
/*
* 我当时代码写到这一步遇到的问题
* 目前问题是无法调用push方法,只能通过多态的方式解决
*/ }
}
} //消费类
class consumer implements Runnable
{
//定义父类的引用,私有的原因是不想任意修改父类引用的指向
private synstack ss = null; //构造方法,通过多态的实现父类引用指向的不同,从而达到调用内部方法的作用
public consumer(synstack ss)
{
//this出现在构造方法中时表示正在构造的对象
this.ss = ss;
}
//重写run方法,实现输出
public void run()
{
//刻意得减慢消费的速度
for(int i=0; i<26; i++)
{
//sleep属于必须要捕获的异常
try
{
Thread.sleep(1000);
}
catch(Exception e)
{ } //开始调用消费
ss.pop();
} }
} public class Pc
{
public static void main(String[] args)
{
//构造出杯子对象
synstack ss = new synstack(); //构建出生产对象
producer p = new producer(ss); //构建出消费对象
consumer c = new consumer(ss); //创建线程,第二种方式
Thread t1 = new Thread (p);
Thread t2 = new Thread (c); //开启线程
t1.start();
t2.start(); }
}

Java实现生产与消费(完美注释版)的更多相关文章

  1. Kafka 使用Java实现数据的生产和消费demo

    前言 在上一篇中讲述如何搭建kafka集群,本篇则讲述如何简单的使用 kafka .不过在使用kafka的时候,还是应该简单的了解下kafka. Kafka的介绍 Kafka是一种高吞吐量的分布式发布 ...

  2. Java实现远程服务生产与消费(RPC)的4种方法-RMI,WebService,HttpClient,RestTemplate

    目录 一. 通过rmi实现远程服务的生产与消费 远程服务提供者实现. 创建rmi-provider项目(Maven) 远程服务消费者实现 创建rmi-consumer项目 二. 通过WebServic ...

  3. JAVA代码之RocketMQ生产和消费数据

    一.启动RocketMQ [root@master ~]# cat /etc/hosts # Do not remove the following line, or various programs ...

  4. 唯品会Java开发手册》1.0.2版阅读

    <唯品会Java开发手册>1.0.2版阅读 1. 概述 <阿里巴巴Java开发手册>,是首个对外公布的企业级Java开发手册,对整个业界都有重要的意义. 我们结合唯品会的内部经 ...

  5. C# 多线程详解 Part.04(Lock、Monitor、生产与消费)

           系列1 曾经说过:每个线程都有自己的资源,但代码区是共享的,即每个线程都可以执行相同的函数.        这可能带来的问题就是多个线程同时执行一个函数,并修改同一变量值,这将导致数据的 ...

  6. Python 基于Python结合pykafka实现kafka生产及消费速率&主题分区偏移实时监控

    基于Python结合pykafka实现kafka生产及消费速率&主题分区偏移实时监控   By: 授客 QQ:1033553122   1.测试环境 python 3.4 zookeeper- ...

  7. 《多线程操作之生产者消费者》(单生产单消费&多生产多消费)

    说明1:假设有一个放商品的盘子(此盘子只能放下一个商品).生产者每次生产一个商品之后,放到这个盘子里,然后唤醒消费者来消费这个面包.消费者消费完这个商品之后,就唤醒生产者生产下一个商品.前提是,只有盘 ...

  8. Java基础(Java概述、环境变量、注释、关键字、标识符、常量)

    第1天 Java基础语法 今日内容介绍 u Java开发环境搭建 u HelloWorld案例 u 注释.关键字.标识符 u 数据(数据类型.常量) 第1章 Java开发环境搭建 1.1 Java概述 ...

  9. JAVA实现生产消费者模型

    前言 最近面试比较多,发现生产消费者模型在各公司面试的过程中问的还是比较多的,记录一下常见JAVA实现生产者消费模型的代码 思路 我们通过三种模式来实现 通过wait和notify 通过Lock和Co ...

随机推荐

  1. 4 react 简书 引入 redux 的 combineReducers 对 redux 数据进行管理

    1. src 下的 common 下的 header 创建 store 文件夹 下创建 reducer.js # src/common/header/store/reducer.js const st ...

  2. SASS - 混合(Mixin)

    SASS – 简介 SASS – 环境搭建 SASS – 使用Sass程序 SASS – 语法 SASS – 变量 SASS- 局部文件(Partial) SASS – 混合(Mixin) SASS ...

  3. git登录账号密码错误remote: Incorrect username or password (access token)

    git提交时弹框让输入用户和密码,不小心输入错误了 再次提交 一直就提示  remote: Incorrect username or password 错误了,也不弹框要重新输入 解决方法 win1 ...

  4. AT1983 BBQ Hard 解题报告

    题意 求\(\sum_{i=1}^{n} \sum_{j=i+1}^{n} \dbinom{a_i+a_j}{a_i+b_i+a_j+b_j}\) 解法 考虑\(\dbinom{a_i+a_j}{a_ ...

  5. k8s pod.yml解释

    apiVersion: v1kind: Podmetadata:  name: yueying  namespace: kube-public  labels:    name: testpodssp ...

  6. cmd 删除整个目录

    rmdir 删除整个目录好比说我要删除 222 这个目录下的所有目录和档案,这语法就是: rmdir /s/q 222 其中: /s 是代表删除所有子目录跟其中的档案. /q 是不要它在删除档案或目录 ...

  7. OpenCV和Qt的图像格式互转

    做图像处理的时候经常使需要用到opencv的,这应该是免费的图像处理库中用得最广泛而且最好用的库了吧.然后有时候想用界面来展示点东西的时候,我们就需要编写个界面,编写界面的方法千千万,弱水三千我只取一 ...

  8. Java final 关键字的用法以及原理(7)

    /* final : 最终.作为一个修饰符, 1:可以修饰类,函数,变量. 2:被final修饰的类不可以被继承.为了避免被继承,被子类复写功能. 3:被final修饰的方法不可以被复写. 4:被fi ...

  9. 移植zlib

    平台说明 开发平台:Ubuntu12.04 编 译器:arm-linux-gcc version 4.4.4 (4.4.4_09.06.2010) Zlib源码包:zlib-1.2.11.tar.gz ...

  10. 今天 运营同事发现的bug记录 上传商品时商品名称带双引号 导致输出页面时 双引号被转义

    例如  ”sk||““美白”淡化 这样输出表单页面时显示出来的只有sk||  解决办法 把输出文字对双引号进行转义