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 ...
随机推荐
- 18 react react-redux 的编写 TodoList
1. 安装 react-redux yarn add react-redux 2. react-redux 编写 TodoList 使所有子组件 都能使用 store #index.js import ...
- 04-String——课后作业1:字串加密
题目:请编写一个程序,加密或解密用户输入的英文字串要求设计思想.程序流程图.源代码.结果截图. 程序设计思想:首先由用户选择是加密还是解密,利用String类中的charAt函数依次取出字串中的字符, ...
- 基于Docker本地运行Kubernetes
基于Docker本地运行Kubernetes 概览 下面的指引将高速你如何通过Docker创建一个单机.单节点的Kubernetes集群. 下图是最终的结果: 先决条件 \1. 你必须拥有一台安装有D ...
- HashMap源码阅读笔记
HashMap源码阅读笔记 本文在此博客的内容上进行了部分修改,旨在加深笔者对HashMap的理解,暂不讨论红黑树相关逻辑 概述 HashMap作为经常使用到的类,大多时候都是只知道大概原理,比如 ...
- 给vector对象添加元素的方法
#include<iostream> #include<vector> using namespace std; int main() { //初始化10个元素,每个值都为0 ...
- CSS 宽,高,背景设置
width 宽,height 高,background 背景:背景色 background-color:颜色值--英文单词/十六进制/rgb:背景图 background-image:url(‘图片路 ...
- Centos下nginx安装
安装很简单,这里记录只是为了记下下载地址: A.[root@localhost soft]# wget http://nginx.org/download/nginx-1.4.2.tar.gz B.[ ...
- delphi的procedure of object
delphi的procedure of object(一个特殊的指针类型) 理论: //适用于实现不是某一特定过程或函数 type TNotifyEvent = procedure(Sender: T ...
- linux环境java程序cpu爆表问题查证
1.top命令查找导致cup爆表的进程 2. top -H -p10832 (10832是Java进程的PID)命令找出了具体的线程 3.使用用命令 jstack 10832> jstack.t ...
- python对数组缺失值进行填充
1. 两个常用的函数 1.1 np.nonzero() np.nonzero()函数返回数组中不为False(0)的元素对应的索引 a = np.array([1,2,0,3,1,0]) print( ...