/**
* 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. # vim ~/.vimrc vim配色

    Ubuntu # vim ~/.vimrc        # /hom/zzx 下 set nomodeline                "(这个一定要写,目前有这个安全漏洞) set ...

  2. POJ_3122 经典二分题

    Pie Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8594   Accepted: 3124   Special Jud ...

  3. Java基础——HashTable源码分析

    HashTable是基于哈希表的Map接口的同步实现 HashTable中元素的key是唯一的,value值可重复 HashTable中元素的key和value不允许为null,如果遇到null,则返 ...

  4. c# 数据库操作,多数据库操作、数据库操作异常报错等问题

    1.引入相关的命名空间 在C#中要操作数据库,一般情况需要引入两个命名空间,在三种连接模式中都要引入下面的命名空间: System.Data;描述与数据源连接的当前状态. // // 摘要: // 连 ...

  5. 用Python读取一个文本文件并统计词频

    刚刚在写文章时360浏览器崩溃了,结果内容还是找回来了,感谢博客园的自动保存功能!!! ------------恢复内容开始------------ 最近在学习Python,自己写了一个小程序,可以从 ...

  6. [极客大挑战 2019]FinalSQL

    0x00 知识点 盲注 0x01 解题 根据题目提示盲注,随便点几下找到注入点 发现我们输入^符号成功跳转页面,证明存在注入 1^(ord(substr((select(group_concat(sc ...

  7. 2016蓝桥杯省赛C/C++A组第三题 方格填数

    题意:如下的10个格子  填入0~9的数字.要求:连续的两个数字不能相邻. (左右.上下.对角都算相邻) 一共有多少种可能的填数方案? 分析:dfs,划定边界,行1~4,列1~3,初始化为INT_IN ...

  8. POJ 1401:Factorial 求一个数阶乘的末尾0的个数

    Factorial Time Limit: 1500MS   Memory Limit: 65536K Total Submissions: 15137   Accepted: 9349 Descri ...

  9. Python说文解字_Python之多任务_01

    Python 之 多任务: Python之多任务是现在多任务编程运用Python语言为载体的一种体现.其中涵盖:进程.线程.并发等方面的内容,以及包括近些年在大数据运算.人工智能领域运用强大的GPU运 ...

  10. CTF -攻防世界-web高手区-ics-06

    打开网址 根据题意点开报表中心(因为其他的点开都一样,不信你试试) 会看见id =1 想到burp爆破id 所以打开burp抓包(不会抓包的百度 或者看我web新手区,有一题就有抓包 我说的很详细) ...