Java实现生产与消费(完美注释版)
/**
* 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实现生产与消费(完美注释版)的更多相关文章
- Kafka 使用Java实现数据的生产和消费demo
前言 在上一篇中讲述如何搭建kafka集群,本篇则讲述如何简单的使用 kafka .不过在使用kafka的时候,还是应该简单的了解下kafka. Kafka的介绍 Kafka是一种高吞吐量的分布式发布 ...
- Java实现远程服务生产与消费(RPC)的4种方法-RMI,WebService,HttpClient,RestTemplate
目录 一. 通过rmi实现远程服务的生产与消费 远程服务提供者实现. 创建rmi-provider项目(Maven) 远程服务消费者实现 创建rmi-consumer项目 二. 通过WebServic ...
- JAVA代码之RocketMQ生产和消费数据
一.启动RocketMQ [root@master ~]# cat /etc/hosts # Do not remove the following line, or various programs ...
- 唯品会Java开发手册》1.0.2版阅读
<唯品会Java开发手册>1.0.2版阅读 1. 概述 <阿里巴巴Java开发手册>,是首个对外公布的企业级Java开发手册,对整个业界都有重要的意义. 我们结合唯品会的内部经 ...
- C# 多线程详解 Part.04(Lock、Monitor、生产与消费)
系列1 曾经说过:每个线程都有自己的资源,但代码区是共享的,即每个线程都可以执行相同的函数. 这可能带来的问题就是多个线程同时执行一个函数,并修改同一变量值,这将导致数据的 ...
- Python 基于Python结合pykafka实现kafka生产及消费速率&主题分区偏移实时监控
基于Python结合pykafka实现kafka生产及消费速率&主题分区偏移实时监控 By: 授客 QQ:1033553122 1.测试环境 python 3.4 zookeeper- ...
- 《多线程操作之生产者消费者》(单生产单消费&多生产多消费)
说明1:假设有一个放商品的盘子(此盘子只能放下一个商品).生产者每次生产一个商品之后,放到这个盘子里,然后唤醒消费者来消费这个面包.消费者消费完这个商品之后,就唤醒生产者生产下一个商品.前提是,只有盘 ...
- Java基础(Java概述、环境变量、注释、关键字、标识符、常量)
第1天 Java基础语法 今日内容介绍 u Java开发环境搭建 u HelloWorld案例 u 注释.关键字.标识符 u 数据(数据类型.常量) 第1章 Java开发环境搭建 1.1 Java概述 ...
- JAVA实现生产消费者模型
前言 最近面试比较多,发现生产消费者模型在各公司面试的过程中问的还是比较多的,记录一下常见JAVA实现生产者消费模型的代码 思路 我们通过三种模式来实现 通过wait和notify 通过Lock和Co ...
随机推荐
- 4 react 简书 引入 redux 的 combineReducers 对 redux 数据进行管理
1. src 下的 common 下的 header 创建 store 文件夹 下创建 reducer.js # src/common/header/store/reducer.js const st ...
- SASS - 混合(Mixin)
SASS – 简介 SASS – 环境搭建 SASS – 使用Sass程序 SASS – 语法 SASS – 变量 SASS- 局部文件(Partial) SASS – 混合(Mixin) SASS ...
- git登录账号密码错误remote: Incorrect username or password (access token)
git提交时弹框让输入用户和密码,不小心输入错误了 再次提交 一直就提示 remote: Incorrect username or password 错误了,也不弹框要重新输入 解决方法 win1 ...
- 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_ ...
- k8s pod.yml解释
apiVersion: v1kind: Podmetadata: name: yueying namespace: kube-public labels: name: testpodssp ...
- cmd 删除整个目录
rmdir 删除整个目录好比说我要删除 222 这个目录下的所有目录和档案,这语法就是: rmdir /s/q 222 其中: /s 是代表删除所有子目录跟其中的档案. /q 是不要它在删除档案或目录 ...
- OpenCV和Qt的图像格式互转
做图像处理的时候经常使需要用到opencv的,这应该是免费的图像处理库中用得最广泛而且最好用的库了吧.然后有时候想用界面来展示点东西的时候,我们就需要编写个界面,编写界面的方法千千万,弱水三千我只取一 ...
- Java final 关键字的用法以及原理(7)
/* final : 最终.作为一个修饰符, 1:可以修饰类,函数,变量. 2:被final修饰的类不可以被继承.为了避免被继承,被子类复写功能. 3:被final修饰的方法不可以被复写. 4:被fi ...
- 移植zlib
平台说明 开发平台:Ubuntu12.04 编 译器:arm-linux-gcc version 4.4.4 (4.4.4_09.06.2010) Zlib源码包:zlib-1.2.11.tar.gz ...
- 今天 运营同事发现的bug记录 上传商品时商品名称带双引号 导致输出页面时 双引号被转义
例如 ”sk||““美白”淡化 这样输出表单页面时显示出来的只有sk|| 解决办法 把输出文字对双引号进行转义