前言

还记得今年参加自学操作系统考试,最难分析的就是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. POJ2456(最大化最小值)

    Aggressive cows Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10728   Accepted: 5288 ...

  2. 第十四届华中科技大学程序设计竞赛决赛同步赛 A - Beauty of Trees

    A - Beauty of Trees 题意: 链接:https://www.nowcoder.com/acm/contest/119/A来源:牛客网 Beauty of Trees 时间限制:C/C ...

  3. windows配置apache tomcat 集群

      1,安装包 httpd-2.2.22-win32-x86-no_ssl.msi 两个tomcat6 2,配置apachehttpd---配置的过程中有错误可以查看logs文件夹下的log文件进行排 ...

  4. log4j配置文件加载方式

    使用背景: apache的log4j是一个功能强大的日志文件,当我们使用eclipse等IDE在项目中配置log4j的时候,需要知道我们的配置文件的加载方式以及如何被加载的. 加载方式: (1).自动 ...

  5. DAY7-面向对象之多态与多态性

    一.多态 多态指的是一类事物有多种形态 动物有多种形态:人,狗,猪 import abc class Animal(metaclass=abc.ABCMeta): #同一类事物:动物 @abc.abs ...

  6. 今天出现编码出现了No suitable driver found for jdbc

    出现这样的情况,一般有四种原因: 一:连接URL格式出现了问题(Connection conn=DriverManager.getConnection("jdbc:mysql://local ...

  7. fluent仿真数值错误

  8. Ajax入门(二)Ajax函数封装

    如果看了的我上一篇博客<Ajax入门(一)从0开始到一次成功的GET请求>的话,肯定知道我们已经完成了一个简单的get请求函数了.如下: 1234567891011121314151617 ...

  9. SpringJdbc 【springjdbc的使用方法】

    1 什么是springjdbc spring对jdbc的封装 2 使用SpringJdbc的编程步骤 2.1 导包 spring-jdbc : springjdbc的包 mysql : MySQL的驱 ...

  10. Condition实现等待、通知

    使用Condition实现等待/通知: import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.L ...