/**
* 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. 基于 burpsuite的web逻辑漏洞插件开发(来自JSRC安全小课堂,柏山师傅)

    基于 burpsuite的web逻辑漏洞插件开发 BurpSuite 提供了插件开发接口,支持Java.Python.Ruby语言的扩展.虽然 BApp Store 上面已经提供了很多插件,其中也不乏 ...

  2. TP多条件查询实例

    where条件查询,时间范围查询 $condition = [ ['member_id', '=', $member_id] ]; if($type) { $condition[] = ['type' ...

  3. idea新建java项目

    盘符下新建一个目录: 打开idea: Open -> 新建的目录: 右击目录 -> new -> module: 填写模块名 -> finish: file -> pro ...

  4. linux下的hashpump安装及使用

    hashpump是linux上的一个进行hash长度拓展攻击的工具,安装过程如下: git clone https://github.com/bwall/HashPump apt-get instal ...

  5. Maven - Repository(存储库)

    版权所有,未经授权,禁止转载 章节 Maven – 简介 Maven – 工作原理 Maven – Repository(存储库) Maven – pom.xml 文件 Maven – 依赖管理 Ma ...

  6. C++基础--重载、重写、隐藏

    1.重载(overload) 重载的概念是在同一作用域内,函数名相同,函数输入参数个数.数据类型不同,但是不能是函数名.参数个数.数据类型完全相同但返回值不同的情况.最直接的例子是常见的构造函数重载, ...

  7. 用Pandas Dataframe支撑起多只金融产品股票的数据内部形态

    3. 如果同时拿一个板块股票的收市价和成交额 前一篇说到,用大盘指数,如恒生指数,上证,深证,这些重要的大盘指数来做Dataframe主键,那麽如果是同时拿一个板块股票的收市价和成交额,可以怎样操作呢 ...

  8. 深入JVM(一)JVM指令手册

    本文按照如下思维导图组织 1. 栈和局部变量操作 1.1 将常量压入栈的指令 aconst_null 将null对象引用压入栈iconst_m1 将int类型常量-1压入栈iconst_0 将int类 ...

  9. 五步解决windows系统慢的问题

    第一步:清理浏览器缓存 第二步:磁盘整理 第三步:碎片整理 第四步:清理系统临时文件 echo 正在清除系统垃圾文件,请稍等...... del /f /s /q %systemdrive%\*.tm ...

  10. 吴裕雄--天生自然MySQL学习笔记:MySQL 排序

    从 MySQL 表中使用 SQL SELECT 语句来读取数据. 如果我们需要对读取的数据进行排序,我们就可以使用 MySQL 的 ORDER BY 子句来设定你想按哪个字段哪种方式来进行排序,再返回 ...