Java—多线程实现PV效果
前言
还记得今年参加自学操作系统考试,最难分析的就是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效果的更多相关文章
- Java多线程(一)——线程基础和锁锁锁
目录 Java多线程(一) 一.线程的定义 二.Synchronize线程同步 三.偏向锁.自旋锁.重量级锁 四.volatile关键字 五.Compare And Swap无锁自旋优化技术和ABA版 ...
- java 多线程 1 线程 进程
Java多线程(一).多线程的基本概念和使用 2012-09-10 16:06 5108人阅读 评论(0) 收藏 举报 分类: javaSE综合知识点(14) 版权声明:本文为博主原创文章,未经博 ...
- 第一章 Java多线程技能
1.初步了解"进程"."线程"."多线程" 说到多线程,大多都会联系到"进程"和"线程".那么这两者 ...
- Java多线程编程核心技术---学习分享
继承Thread类实现多线程 public class MyThread extends Thread { @Override public void run() { super.run(); Sys ...
- java多线程编程
一.多线程的优缺点 多线程的优点: 1)资源利用率更好2)程序设计在某些情况下更简单3)程序响应更快 多线程的代价: 1)设计更复杂虽然有一些多线程应用程序比单线程的应用程序要简单,但其他的一般都更复 ...
- Java多线程20:多线程下的其他组件之CountDownLatch、Semaphore、Exchanger
前言 在多线程环境下,JDK给开发者提供了许多的组件供用户使用(主要在java.util.concurrent下),使得用户不需要再去关心在具体场景下要如何写出同时兼顾线程安全性与高效率的代码.之前讲 ...
- Java多线程系列--“基础篇”05之 线程等待与唤醒
概要 本章,会对线程等待/唤醒方法进行介绍.涉及到的内容包括:1. wait(), notify(), notifyAll()等方法介绍2. wait()和notify()3. wait(long t ...
- Java多线程系列--“JUC原子类”02之 AtomicLong原子类
概要 AtomicInteger, AtomicLong和AtomicBoolean这3个基本类型的原子类的原理和用法相似.本章以AtomicLong对基本类型的原子类进行介绍.内容包括:Atomic ...
- Java多线程编程核心技术---拾遗增补
线程状态验证 public class MyThread extends Thread { public MyThread() { System.out.println("构造方法中的状态: ...
随机推荐
- 一般处理程序+html 的CRUD
using Console_Core.BLL; using Console_Core.Common; using Console_Core.Model; using System; using Sys ...
- Nunit 2.6 无法调试.Net Framework 4.0
<configuration> <!-- The GUI only runs under .NET 2.0 or higher. The useLegacyV2RuntimeActi ...
- mysql update不支持子查询更新
先看示例: SELECT uin,account,password,create_user_uin_tree FROM sys_user 结果: 表中的create_user_uin_tree标识该条 ...
- pos机的热敏纸尺寸
57x50或者是57x30,两个型号宽度都是一样的,只是厚度不一样,前者是厚一点,适合固定机用,后者适合移动POS机用 厚度不是指纸的厚度,而是纸的容量,移动机的纸槽较小只能用57X30的
- Java enum(枚举)使用详解之四
用法五:实现接口 所有的枚举都继承自java.lang.Enum类.由于Java 不支持多继承,所以枚举对象不能再继承其他类. public interface Behaviour { void pr ...
- leetcode482
这道题主要使用了C++的几个API,大小写转化,字符串替换.其余的逻辑都比较简单.而且经查资料,string类字符串拼接的速度使用+=的速度是很快的.以下代码,也是用的+=来拼接字符串. string ...
- SQL 实现行列互换
Oracle:不过大多数是采用 oracle 数据库当中的一些便捷函数进行处理,比如 ”pivot”: MySql:目前没有找到更好的方法 题目:数据库中有一张如下所示的表,表名为sales. 年 季 ...
- php命令行操作
1.php -v返回版本 -i选项返回安装的有关信息 -h访问帮助文件 -m列出编译到当前PHP安装的全部模块 CLI与CGI区别: 在命令行脚本环境中,有两种版本的PHP可以使用,旧版本是CGI ...
- day36-hibernate检索和优化 02-Hibernate检索方式:简单查询及别名查询
Hibernate: insert into Customer (cname) values (?)Hibernate: in ...
- ==, equals, hashcode的理解
一.java对象的比较 等号(==): 对比对象实例的内存地址(也即对象实例的ID),来判断是否是同一对象实例:又可以说是判断对象实例是否物理相等: equals(): 对比两个对象实例是否相等. 当 ...