Java入门到精通——基础篇之多线程实现简单的PV操作的进程同步
一、概述
PV操作是对信号量进行的操作。进程同步是指在并发进程之间存在一种制约关系,一个进程的执行依赖另一个进程的消息,当一个进程没有得到另一个进程的消息时应等待,直到消息到达才被唤醒。举例:就像消费者与生产者的关系,说吃馒头把有一个碗能盛下6个馒头,厨师不停的生产馒头,顾客不停的吃馒头,此时厨师与顾客的关系就是同步。(如下图)
下面我就为大家利用java多线程的代码实现这个操作的过程。
二、代码展示。
1、ManTou.java
- package com.gaowei.PV;
- public class ManTou {
- int id;
- ManTou(int id) {
- this.id = id;
- }
- public String toString() {
- return "ManTou : " + id;
- }
- }
2、厨师类Pclient.java
- package com.gaowei.PV;
- public class PClient implements Runnable {
- private SyncStack ss=null;
- public PClient(SyncStack ss){
- this.ss=ss;
- }
- @Override
- public void run() {
- for (int i = 0; i < 20; i++) {
- ManTou mt=new ManTou(i);
- ss.push(mt);
- System.out.println("生产了:"+mt);
- try {
- Thread.sleep(1000);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- }
- }
3、顾客类Vclient.java
- package com.gaowei.PV;
- public class VClient implements Runnable {
- private SyncStack ss=null;
- public VClient(SyncStack ss){
- this.ss=ss;
- }
- @Override
- public void run() {
- for(int i=0; i<20; i++) {
- ManTou mt = ss.pop();
- System.out.println("消费了: " + mt);
- try {
- Thread.sleep(6000);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- }
- }
4、碗类SyncStack.java
- package com.gaowei.PV;
- public class SyncStack {
- private int index=0;
- ManTou[] arrMT=new ManTou[6];
- //添加馒头
- public synchronized void push(ManTou mt){
- while (index==arrMT.length) {
- try {
- this.wait();
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- this.notifyAll();
- arrMT[index]=mt;
- index++;
- }
- //吃馒头
- public synchronized ManTou pop(){
- while(index==0){
- try {
- this.wait();
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- this.notifyAll();
- index--;
- return arrMT[index];
- }
- }
5、客户端显示效果代码PVClient.java
- package com.gaowei.PV;
- public class PVClient {
- public static void main(String[] args) {
- SyncStack ss = new SyncStack();
- PClient p = new PClient(ss);
- VClient v= new VClient(ss);
- new Thread(p).start();
- new Thread(v).start();
- }
- }
6、效果图
由于顾客吃馒头慢要6s吃个馒头,而厨师做馒头快1s就能做一个馒头所以从图中的分布大家就可以发现厨师做到了第6个馒头了消费者才吃了1个馒头接下来由于碗中只能盛下6个馒头所以厨师只有等着顾客吃一个然后在放一个馒头到碗里,一直到最后厨师20个馒头做完了顾客还得继续把剩下的6个馒头吃完才能结束。
三、总结。
利用多线程实现了PV操作了接下了就要思考一下PV操作的好处在哪里?在实现代码的过程中说一个细节问题当顾客吃了一个馒头之后就会通知厨师这个线程来生产馒头,厨师生产一个馒头也会去通知顾客来吃馒头。这样的思路就和观察者思路差不多能解决生产者与消费者的耦合。说高大上点就是生产者干自己的事情,消费者干自己的事情,通过碗中消息来通知生产者该干嘛,消费者该干嘛。这样的话就把生产者和消费者的关系解耦了。
本文转自:http://blog.csdn.net/gwblue/article/details/44515931
Java入门到精通——基础篇之多线程实现简单的PV操作的进程同步的更多相关文章
- Java入门到精通——基础篇之面向对象
一.概述. Java属于面向对象的一种语言,因为Java是面向对象的语言所以这个语言的诞生需要有五个基本特性: 1)万物皆为对象. 2)程序是对象的集合. 3)每个对象都有自己的由其他对象所构成的存储 ...
- Java入门到精通——基础篇之static关键字
一.概述 static 关键字是声明静态变量,静态方法用的.static的含义是属于类且不属于类对象的变量和函数. 二.static的产生. 在创建对象的时候除非用new ...
- Java从入门到精通——基础篇之JSTL标签
一.语言基础 EL(Expression Language)表达式,目的:为了使JSP写起来更加简单.提供了在 JSP 中简化表达式的方法. 二.分类 核心标签库:提供条件判断.属性访问.URL处理及 ...
- Java从入门到精通——基础篇之Servlet与JSP的区别
一.基本概念 1.1 Servlet Servlet是一种服务器端的Java应用程序,具有独立于平台和协议的特性,可以生成动态的Web页面.它担当客户请求(Web浏览器或其他HTTP客户程序)与服务器 ...
- Java入门到精通——框架篇之Spring源码分析Spring两大核心类
一.Spring核心类概述. Spring里面有两个最核心的类这是Spring实现最重要的部分. 1.DefaultListableBeanFactory 这个类位于Beans项目下的org.spri ...
- Java入门到精通——工具篇之Maven概述
为接手gxpt准备已经快一个月了从SSH2-->EJB-->环境搭建-->Maven的构建.下面就带领大家初始Maven 一.什么是Maven. Maven是一个垮平台的项目管理工具 ...
- Java入门到精通——框架篇之Hadoop概述
一.Hadoop来历 Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明了倒排索引算法,通过加入了Map ...
- 学java入门到精通,不得不看的15本书
学java入门到精通,不得不看的15本书 一.Java编程入门类1.<Java编程思想>2.<Agile Java>中文版 二.Java编程进阶类1.<重构 改善既有代码 ...
- Java面试题之基础篇概览
Java面试题之基础篇概览 1.一个“.java”源文件中是否可以包含多个类(不是内部类)?有什么限制? 可以有多个类,但只能有一个public的类,且public的类名必须与文件名相一致. 2.Ja ...
随机推荐
- Flash Activex NPAPI PPAPI 各种网页插件完整安装包下载地址
内容全部是自己手工原创写作的参考内容,完全排除从其他网站COPY的内容信息.如有雷同实属巧合. 奉献给有需求的人士,也给各位解决FLASH安装头疼的问题,正常在线下载安装运气不好的安装半天.运气好 ...
- Java中resourceBundle和Properties的区别
第一种办法InputStream is = Test.class.getResourceAsStream("DbConfig.properties");Properties p = ...
- TTL值的含义以及与域名DNS TTL值的区别
TTL值的含义以及与域名TTL值的区别 本文来源于时光漂流瓶 http://www.9usb.net , 原文地址: http://www.9usb.net/201004/ttl-yuyuming-t ...
- LCS最长公共子序列
问题:最长公共子序列不要求所求得的字符串在所给字符串中是连续的,如输入两个字符串ABCBDAB和BDCABA,字符串BCBA和BDAB都是他们的公共最长子序列 该问题属于动态规划问题 解答:设序列X= ...
- Spiral Matrix
Spiral Matrix Given a matrix of m x n elements (m rows, n columns), return all elements of the matri ...
- springMvc基本注解:@Component、@Repository(持久层) 、@Service(业务逻辑) 、@Controller(控制层)
1.@Controller(控制层) :就是action层 2.@Service(业务逻辑) :业务逻辑层,负责处理各种控制层的操作 3.@Repository(持久层) :称为“持久化”层,负责对数 ...
- HTTP 错误 500.21 - Internal Server ErrorHTTP
应用程序“DEFAULT WEB SITE/WINDRP_TB/TBFXWS”中的服务器错误Internet Information Services 7.5错误摘要HTTP 错误 500.21 - ...
- ios7去除手势滑动返回
if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) { sel ...
- HDU 5637 Transform 单源最短路
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5637 题意: http://bestcoder.hdu.edu.cn/contests/contes ...
- 【POJ】【2151】Check the difficulty of problems
概率DP kuangbin总结中的第8题 一开始题目看错导致想转移方程想错了……想成f[i][j]表示前 i 个队伍中最多的做出来 j 道题的概率……sigh 看了下题解……其实是对于每个队伍 i 单 ...