前言

还记得今年参加自学操作系统考试,最难分析的就是PV这部分,然而伟大的米老师却用一个放东西吃东西的小例子,把PV讲的栩栩如生,言简意赅。学J2SE时学到了线程部分,里面提到了线程同步,死锁问题等等一系列问题,现在(结合马士兵老师分析例子,通过java语言实现当时的PV效果。

内容

  • 需求:

生产者生产窝头给消费者吃,生产者将生产的窝头放到篮子里,消费者拿着吃。为了防止生产者生产的窝头放满了篮子,再生产放不了或者消费者一直吃窝头,最后篮子的窝头没了消费者饿死了,这种情况。需要引入多线程,在生产者和消费者同时进行。其中生产者如果把篮子填满了,这时需要停下来,通知消费者赶紧吃,反之,消费者吃了窝头,吃完了后也已应该停下来,赶紧通知生产者生产窝头。

  • 根据马士兵老师的面向对象分析方法来分析:

对象:生产者、消费者、篮子、窝头

  • 技术点:

线程创建启动;类实现接口进而实现接口方法;异常的处理;notify()方法应用;数组和其他一些循环结构等的应用;

  • UML图

  • Demo
/*
作者:周丽同
说明:生产者生产窝头给消费者吃,引用多线程保证这个流程正常运行;
*/
public class ProducerConsumer{
public static void main(String[] args){
SyncStack ss = new SyncStack();
new Thread(new Producer(ss)).start();//创建线程,并启动线程;
new Thread(new Consumer(ss)).start();//创建线程,并启动线程;
}
} //窝头类
class WoTou{
int id;
WoTou(int id){
this.id=id;
} public String toString(){
return "窝头" + id;
}
} //生产池
class SyncStack{
int index = 0;//标记现在有几个窝头;
WoTou[] arrayWoTou = new WoTou[6]; //生产者向生产池中放入窝头;
public synchronized void push(WoTou wt){ //"synchronized"用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码
//要用while不要用if,如果用if出现例外的话,会继续向下进行,导致索引溢出;
while(index >= 6){
try{
this.wait();
}catch(InterruptedException e){
e.printStackTrace();//用来跟踪异常事件的发生时执行堆栈的内容;
}
} notify();//随机通知一个正在等待的线程;
arrayWoTou[index] = wt;
index++;
} //消费者从生产池中消费窝头;
public synchronized WoTou pop(){
while(index <= 0){
try{
this.wait();
}catch(InterruptedException e){
e.printStackTrace();//用来跟踪异常事件的发生时执行堆栈的内容;
}
} notify();//随机通知一个正在等待的线程;
//先要index--因为index记录的是当前的窝头个数;
index--;
return arrayWoTou[index];
}
} //生产者
class Producer implements Runnable{
SyncStack ss = new SyncStack();
Producer(SyncStack ss){
this.ss=ss;
} public void run(){
for(int i=1;i<=10;i++){
WoTou wt = new WoTou(i);
ss.push(wt);
System.out.printIn("生产了:" + wt);
}
}
} //消费者
class Consumer implements Runnable{
SyncStack ss = new SyncStack();
Consumer(SyncStack ss){
this.ss=ss;
} public void run(){
for(int i=1;i<=10;i++){
WoTou wt = null;
wt = ss.pop();
System.out.printIn("消费了" + wt);
}
}
}

小结

根据需求,自己尝试画了UML,不知道用图中的关系合适不合适,如若有不恰当的地方,还请大神指点一二。

感谢您的宝贵时间······

Java—多线程实现PV效果的更多相关文章

  1. Java多线程(一)——线程基础和锁锁锁

    目录 Java多线程(一) 一.线程的定义 二.Synchronize线程同步 三.偏向锁.自旋锁.重量级锁 四.volatile关键字 五.Compare And Swap无锁自旋优化技术和ABA版 ...

  2. java 多线程 1 线程 进程

    Java多线程(一).多线程的基本概念和使用 2012-09-10 16:06 5108人阅读 评论(0) 收藏 举报  分类: javaSE综合知识点(14)  版权声明:本文为博主原创文章,未经博 ...

  3. 第一章 Java多线程技能

    1.初步了解"进程"."线程"."多线程" 说到多线程,大多都会联系到"进程"和"线程".那么这两者 ...

  4. Java多线程编程核心技术---学习分享

    继承Thread类实现多线程 public class MyThread extends Thread { @Override public void run() { super.run(); Sys ...

  5. java多线程编程

    一.多线程的优缺点 多线程的优点: 1)资源利用率更好2)程序设计在某些情况下更简单3)程序响应更快 多线程的代价: 1)设计更复杂虽然有一些多线程应用程序比单线程的应用程序要简单,但其他的一般都更复 ...

  6. Java多线程20:多线程下的其他组件之CountDownLatch、Semaphore、Exchanger

    前言 在多线程环境下,JDK给开发者提供了许多的组件供用户使用(主要在java.util.concurrent下),使得用户不需要再去关心在具体场景下要如何写出同时兼顾线程安全性与高效率的代码.之前讲 ...

  7. Java多线程系列--“基础篇”05之 线程等待与唤醒

    概要 本章,会对线程等待/唤醒方法进行介绍.涉及到的内容包括:1. wait(), notify(), notifyAll()等方法介绍2. wait()和notify()3. wait(long t ...

  8. Java多线程系列--“JUC原子类”02之 AtomicLong原子类

    概要 AtomicInteger, AtomicLong和AtomicBoolean这3个基本类型的原子类的原理和用法相似.本章以AtomicLong对基本类型的原子类进行介绍.内容包括:Atomic ...

  9. Java多线程编程核心技术---拾遗增补

    线程状态验证 public class MyThread extends Thread { public MyThread() { System.out.println("构造方法中的状态: ...

随机推荐

  1. 蓝桥杯 算法训练 ALGO-117 友好数

    算法训练 友好数   时间限制:1.0s   内存限制:256.0MB 问题描述 有两个整数,如果每个整数的约数和(除了它本身以外)等于对方,我们就称这对数是友好的.例如: 9的约数和有:1+3=4 ...

  2. java代码异常处理

    总结:运用throw和throws抛出异常,在哪一种情况下该怎么抛出异常.重要 package com.b; //异常中throwe和throws的用法 public class yz { publi ...

  3. 【转】Jquery修改image的src属性,图片不加载问题

    1.当点击某一按钮的时候,把图片域中的图片改变一下    <img id="randimg" src="/servlet/CreateValidateNum&quo ...

  4. MyBatis----延迟加载demo

    一:创建数据库脚本drop table project_info; drop table status; create table status( id number(10) primary key, ...

  5. Python数据库(二)-Mysql数据库插入数据

    通过python连接mysql数据库,并插入数据 # -*- coding:utf-8 -*- __author__ = "MuT6 Sch01aR" import pymysql ...

  6. FAILED: Execution Error, return code 2 from org.apache.hadoop

    错误遇到的情形: hive整合hbase,hive的数据表 load,select,insert一切正常 通过hive往hbase关联表插入数据的时候报错,错误内容如下: 2016-04-18 14: ...

  7. show table detail

    create table #t(name varchar(255), rows bigint, reserved varchar(20),data varchar(20), index_size va ...

  8. CDN原理解析

    首先,让我们来看一下传统的Internet网络的基本结构和数据传输情况,如下图所示 根据传统的网络结构,用户的访问流程基本如下:  用户在自己的浏览器中输入要访问的网站的域名  浏览器向本地DNS请求 ...

  9. day17 9.关闭资源与异常处理

    Java程序跟任何外部设备进行连接之后,都要把连接断开,把资源释放掉.Connection是一个重量级资源,Connecton占内存,Connection的获取是比较消耗资源和内存的.finally是 ...

  10. 奇葩问题 eclipse下 maven项目 java Resource报个小红叉,然而里面却没有小红叉

    之前没注意,不知是一开始就有还是这两天才有,说下解决方案: 右击项目“Properties”,在弹出的“Properties”的左侧边框,单击“Project Facets”,打开“Project F ...