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("构造方法中的状态: ...
随机推荐
- 蓝桥杯 算法训练 ALGO-126 水仙花
算法训练 水仙花 时间限制:1.0s 内存限制:256.0MB 水仙花数 问题描述 判断给定的三位数是否 水仙花 数.所谓 水仙花 数是指其值等于它本身 每位数字立方和的数.例 153 就是一 ...
- [转载]Ubuntu下ssh服务的安装与登陆(ssh远程登陆)
转载地址:http://blog.csdn.net/zht666/article/details/9340633 Ubuntu默认并没有安装ssh服务,如果通过ssh远程连接到Ubuntu,需要自己手 ...
- 2016.4.6 WinForm显示PDF两种方法
1.最直接的方法,添加webbrowser控件 webb.Url = new Uri(path);可显示pdf控件. 如果需要在打开时跳转到某页,可用在路径后直接加#page=,例如webb.Url ...
- 2015.5.11 string与byte[]相互转换
string类型转成byte[]: byte[] byteArray = System.Text.Encoding.Default.GetBytes ( str ); 反过来,byte[]转成stri ...
- matlab图片高清复制到visio
编辑→复制图窗→在visio中粘贴
- Reporting services
“数据库引擎服务”可以承载报表服务器数据库.Reporting Services 需要SQL Server 2008 数据库引擎的本地或远程实例来承载报表服务器数据库.如果同时安装数据库引擎实例和 R ...
- (转载)Eclipse报错:java.lang.ClassNotFoundException: ContextLoaderListener
转载自:http://www.cnblogs.com/love540376/p/5527757.html Eclipse中tomcat部署工程启动后报错: 严重: Error configuring ...
- linux中的管道命令
很有用的一个命令,用法如下: A | B 是把A命令的输出作为B命令的输入. 比如我想查看一下我在终端输入过的命令,可以这样: history | less
- 异常日志记录 DDLog
项目中如果想把异常捕获再写入文件,有个十分容易使用的库DDLog. 首先导入库,在git上下载. 一:在项目初始化指定全局LogLeve ,一般在xxxapp.m中 staticconstint dd ...
- GPG入门 - 练习笔记
GPG入门练习笔记 参考阮一峰的GPG入门教程http://www.ruanyifeng.com/blog/2013/07/gpg.html 1.加密 1)刘言机器: 用王老师公钥加密gp ...