一、概述

    PV操作是对信号量进行的操作。

    进程同步是指在并发进程之间存在一种制约关系,一个进程的执行依赖另一个进程的消息,当一个进程没有得到另一个进程的消息时应等待,直到消息到达才被唤醒。举例:就像消费者与生产者的关系,说吃馒头把有一个碗能盛下6个馒头,厨师不停的生产馒头,顾客不停的吃馒头,此时厨师与顾客的关系就是同步。(如下图)

    

    下面我就为大家利用java多线程的代码实现这个操作的过程。

二、代码展示。

1、ManTou.java

  1. package com.gaowei.PV;
  2. public class ManTou {
  3. int id;
  4. ManTou(int id) {
  5. this.id = id;
  6. }
  7. public String toString() {
  8. return "ManTou : " + id;
  9. }
  10. }

2、厨师类Pclient.java

  1. package com.gaowei.PV;
  2. public class PClient implements Runnable {
  3. private SyncStack ss=null;
  4. public PClient(SyncStack ss){
  5. this.ss=ss;
  6. }
  7. @Override
  8. public void run() {
  9. for (int i = 0; i < 20; i++) {
  10. ManTou mt=new ManTou(i);
  11. ss.push(mt);
  12. System.out.println("生产了:"+mt);
  13. try {
  14. Thread.sleep(1000);
  15. } catch (InterruptedException e) {
  16. e.printStackTrace();
  17. }
  18. }
  19. }
  20. }

3、顾客类Vclient.java

  1. package com.gaowei.PV;
  2. public class VClient implements Runnable {
  3. private SyncStack ss=null;
  4. public VClient(SyncStack ss){
  5. this.ss=ss;
  6. }
  7. @Override
  8. public void run() {
  9. for(int i=0; i<20; i++) {
  10. ManTou mt = ss.pop();
  11. System.out.println("消费了: " + mt);
  12. try {
  13. Thread.sleep(6000);
  14. } catch (InterruptedException e) {
  15. e.printStackTrace();
  16. }
  17. }
  18. }
  19. }

4、碗类SyncStack.java

  1. package com.gaowei.PV;
  2. public class SyncStack {
  3. private int index=0;
  4. ManTou[] arrMT=new ManTou[6];
  5. //添加馒头
  6. public synchronized void push(ManTou mt){
  7. while (index==arrMT.length) {
  8. try {
  9. this.wait();
  10. } catch (InterruptedException e) {
  11. e.printStackTrace();
  12. }
  13. }
  14. this.notifyAll();
  15. arrMT[index]=mt;
  16. index++;
  17. }
  18. //吃馒头
  19. public synchronized  ManTou pop(){
  20. while(index==0){
  21. try {
  22. this.wait();
  23. } catch (InterruptedException e) {
  24. e.printStackTrace();
  25. }
  26. }
  27. this.notifyAll();
  28. index--;
  29. return arrMT[index];
  30. }
  31. }

5、客户端显示效果代码PVClient.java

  1. package com.gaowei.PV;
  2. public class PVClient {
  3. public static void main(String[] args) {
  4. SyncStack ss = new SyncStack();
  5. PClient p = new PClient(ss);
  6. VClient v= new VClient(ss);
  7. new Thread(p).start();
  8. new Thread(v).start();
  9. }
  10. }

6、效果图


    由于顾客吃馒头慢要6s吃个馒头,而厨师做馒头快1s就能做一个馒头所以从图中的分布大家就可以发现厨师做到了第6个馒头了消费者才吃了1个馒头接下来由于碗中只能盛下6个馒头所以厨师只有等着顾客吃一个然后在放一个馒头到碗里,一直到最后厨师20个馒头做完了顾客还得继续把剩下的6个馒头吃完才能结束。

三、总结。

    利用多线程实现了PV操作了接下了就要思考一下PV操作的好处在哪里?在实现代码的过程中说一个细节问题当顾客吃了一个馒头之后就会通知厨师这个线程来生产馒头,厨师生产一个馒头也会去通知顾客来吃馒头。这样的思路就和观察者思路差不多能解决生产者与消费者的耦合。说高大上点就是生产者干自己的事情,消费者干自己的事情,通过碗中消息来通知生产者该干嘛,消费者该干嘛。这样的话就把生产者和消费者的关系解耦了。

本文转自:http://blog.csdn.net/gwblue/article/details/44515931

Java入门到精通——基础篇之多线程实现简单的PV操作的进程同步的更多相关文章

  1. Java入门到精通——基础篇之面向对象

    一.概述. Java属于面向对象的一种语言,因为Java是面向对象的语言所以这个语言的诞生需要有五个基本特性: 1)万物皆为对象. 2)程序是对象的集合. 3)每个对象都有自己的由其他对象所构成的存储 ...

  2. Java入门到精通——基础篇之static关键字

    一.概述        static 关键字是声明静态变量,静态方法用的.static的含义是属于类且不属于类对象的变量和函数. 二.static的产生.         在创建对象的时候除非用new ...

  3. Java从入门到精通——基础篇之JSTL标签

    一.语言基础 EL(Expression Language)表达式,目的:为了使JSP写起来更加简单.提供了在 JSP 中简化表达式的方法. 二.分类 核心标签库:提供条件判断.属性访问.URL处理及 ...

  4. Java从入门到精通——基础篇之Servlet与JSP的区别

    一.基本概念 1.1 Servlet Servlet是一种服务器端的Java应用程序,具有独立于平台和协议的特性,可以生成动态的Web页面.它担当客户请求(Web浏览器或其他HTTP客户程序)与服务器 ...

  5. Java入门到精通——框架篇之Spring源码分析Spring两大核心类

    一.Spring核心类概述. Spring里面有两个最核心的类这是Spring实现最重要的部分. 1.DefaultListableBeanFactory 这个类位于Beans项目下的org.spri ...

  6. Java入门到精通——工具篇之Maven概述

    为接手gxpt准备已经快一个月了从SSH2-->EJB-->环境搭建-->Maven的构建.下面就带领大家初始Maven 一.什么是Maven. Maven是一个垮平台的项目管理工具 ...

  7. Java入门到精通——框架篇之Hadoop概述

    一.Hadoop来历 Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明了倒排索引算法,通过加入了Map ...

  8. 学java入门到精通,不得不看的15本书

    学java入门到精通,不得不看的15本书 一.Java编程入门类1.<Java编程思想>2.<Agile Java>中文版 二.Java编程进阶类1.<重构 改善既有代码 ...

  9. Java面试题之基础篇概览

    Java面试题之基础篇概览 1.一个“.java”源文件中是否可以包含多个类(不是内部类)?有什么限制? 可以有多个类,但只能有一个public的类,且public的类名必须与文件名相一致. 2.Ja ...

随机推荐

  1. 防火墙设置:虚拟机ping不通主机,但是主机可以ping通虚拟机(转载)

    我在Windows7系统安装了虚拟机,通过虚拟机安装了Ubuntu13.04,我设置的主机与虚拟机的连接方式是桥接,安装好后,发现虚拟机ping不通主机,但是主机可以ping通虚拟机. 我的操作是:关 ...

  2. WPF 在画布中布局N行N列的实现方法

    最近写一个WPF项目,中间有一个实现在画布中排列的问题(整齐摆列几行几列的算法).本人逻辑有点差啊,废了老大功夫才实现,也没啥就牛逼的,就是拿出来分享一下,给需要的同学节省点时间,如果有用的话别忘赞一 ...

  3. BI的核心价值[转]

    BI的核心价值是辅助决策,从一个洁净的数据源中自动提取有价值的数据进行分析,从而成为重要商业决定的决策基础.但在国内,洁净的数据源不易得到,很多情况下都需要进行数据清洗,所以BI的应用受到很大程度的抑 ...

  4. AJAX异步同步

    为了更好的用户体验,AJAX的异步同步技术给了我们一个很好的用户体验下面是我做的一个例子. 1.客户端处理 UserId.HTML <!DOCTYPE html PUBLIC "-// ...

  5. oracle-12c-rac 报:ORA-01078

    OS: Oracle Linux Server release 5.7 DB: Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - ...

  6. 【android】uiselectoer 自动化测试

    转:http://blog.csdn.net/sasoritattoo/article/details/17579739 Android自动化测试主要分为Monkeyrunner.Rubotium.U ...

  7. 从零开始学ios开发(六):IOS控件(3),Segmented Control、Switch

    这次的学习还是基于上一个项目继续进行(你也可以新建一个项目)学习Segmented Control和Switch. Segmented Control Switch Segmented Control ...

  8. Java的别名机制

    基本类型存储了实际的数值,而并非指向一个对象的引用,所以在为其赋值的时候,是直接将一个地方的内容复制到另一个地方. 但是在为对象"赋值"的时候,情况却发生了变化.对一个对象进行操作 ...

  9. 悲惨的Android程序员

    Android程序员太悲惨了,连Android官网都访问不了,整个Android程序员的水平都被拉低了一个等级.受不了了.说说悲惨的遭遇吧. 起源:高射炮打苍蝇,驴受伤了 Android一个纯技术网站 ...

  10. 关于MDK中:RO-data、RW-data、ZI-data

    最近在LPC2109上调试ENC28J60,协议栈使用的是UIP,刚开始用的telnet服务,能够正常编译运行.然后换成webserver提示: enc28j60.axf: Error: L6406E ...