理发师问题PV操作实现(Java)
import java.util.ArrayList;
import java.util.Scanner;public class Test {public static void main(String[] args) {int customer;Scanner input = new Scanner(System.in);System.out.print("请输入顾客数目:");customer = input.nextInt();input.close();new Thread(new Barber(), "理发师" + Integer.toString(0) + "号").start();for (int i = 0; i < customer; i++) {new Thread(new Customer(), "顾客" + Integer.toString(i) + "号").start();}}
}//理发师
class Barber implements Runnable {@Overridepublic void run() {// TODO Auto-generated method stubwhile (true) {Global.naps();Global.Customer.P(); //试图给顾客理发,没有理发师就睡觉Global.mutex.P(); //修改空椅子的数量Global.empty++; //空出一张椅子Global.mutex.V(); //理发,空出椅子,使进店的顾客能够访问椅子的数量String name = "";if (!Global.cust.isEmpty()) {name = Global.cust.remove(0);}System.out.println(name + " 在理发...");Global.naps();System.out.println(name + " 理完发...");}}
}//顾客
class Customer implements Runnable {@Overridepublic void run() {// TODO Auto-generated method stubGlobal.naps(); //为了防止顾客名字字符串乱码Global.mutex.P(); //想做到椅子上if (Global.empty > 0) { //还有位置Global.empty--; //椅子数量减一Global.Customer.V(); //通知理发师,顾客来了Global.mutex.V(); //顾客做到椅子上Global.cust.add(Thread.currentThread().getName());System.out.println(Thread.currentThread().getName() + " 等待...");} else {Global.mutex.V();System.out.println(Thread.currentThread().getName() + " 离开...");}}
}//全局对象
class Global {public static Semaphore Customer = new Semaphore(0); //是否有顾客public static Semaphore mutex = new Semaphore(1); //互斥信号灯public static int empty = 4; //空椅子数量public static ArrayList<String> cust = new ArrayList<String>(); //等待的顾客//随机等待public static void naps() {try {Thread.sleep((int) (2000 * Math.random()));} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}//信号量
class Semaphore {public int value;public Semaphore(int value) {super();this.value = value;}//P操作public synchronized final void P() {// TODO Auto-generated method stubvalue--;if(value < 0) {try {this.wait();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}//V操作public synchronized final void V() {// TODO Auto-generated method stubvalue++;if (value <= 0) {this.notify();}}
}
理发师问题PV操作实现(Java)相关推荐
- 从操作系统的PV操作理解JAVA的synchronized同步方法,同步代码块实现,及比较
也有利于理解操作系统的同步 知识果然是息息相关的 JAVA同样离不开操作系统的原理,不过他体现在虚拟机JVM中 synchronized关键字是同步关键字 首先我们知道在操作系统里 PV两者操作信息量 ...
- 操作系统中PV操作之顾客理发师问题
PV操作:对信号量进行相应操作 S:信号量 P:请求操作,相当于S=S-1:S>=0,进程继续进行 V:释放操作,相当于S=S+1,S>0,进程被唤醒 理发师问题 一个理发师,一把理发椅, ...
- 操作系统-PV操作-理发师问题
操作系统-PV操作-理发师问题 前言 问题描述 解决思路 伪代码 总结 前言 hello,大家好,使用pv操作来实现进程的同步和互斥是我们本科授课的重点,同时也是研究生入学考试的重点考察题型.今天给大 ...
- java信号量生产者_java信号量PV操作 解决生产者-消费者问题
package test1; /** * 该例子演示生产者和消费者的问题(设只有一个缓存空间.一个消费者和一个生产者) * MySystem类定义了缓冲区个数以及信号量 * @author HYY * ...
- 操作系统 | PV操作七大经典问题 生产者消费者 读者写者 哲学家进餐 理发师理发睡觉 和尚打水 吸烟者 吃水果
一.生产者消费者问题 生产者消费者问题(英语:Producer-consumer problem),也称有限缓冲问题(英语:Bounded-buffer problem),是一个多线程同步问题的经典案 ...
- java pv操作_理解同步的PV操作
PV操作是Edsger Dijkstra提出的一种经典的解决同步不同执行线程的问题的方法,这种方法是基于一种叫信号量的特殊变量来实现的. 简单理解为就是通过共享变量+信号量实现的一种同步机制,其应用与 ...
- java中的pv操作,PV操作简单理解
进程通常分为就绪.运行和阻塞三个工作状态.三种状态在某些条件下可以转换,三者之间的转换关系如下: 进程三个状态之间的转换就是靠PV操作来控制的.PV操作主要就是P操作.V操作和信号量.其中信号量起到了 ...
- 操作系统pv操作学习总结
PV操作 PV操作与信号量的处理相关,P表示通过的意思,V表示释放的意思. 目录 1 简介 2 详细资料 3 解释 ▪ 信号量的概念 ▪ 典型理解偏差 简介 1962年,狄克斯特拉离开数学中心进入位于 ...
- 试利用记录型信号量和pv操作写出_计算机操作系统知识点汇总
1.基本特征 (1)并发:并发是指宏观上在一段时间内能同时运行多个程序,而并行则指同一时刻能运行多个指令.操作系统通过引入进程和线程使得程序能够并发运行: (2)共享:共享是指系统中的资源可以被多个并 ...
最新文章
- 如何用hover写出顺畅的动态效果
- Symantec:揭秘Hidden Lynx组织的APT***行动
- 线性最小二乘问题求解的豪斯荷尔德法C实现
- 访问者(Visitor)模式
- H5移动端页面设计心得分享
- 计算机网络实验(思科模拟器Cisco Packet Tracer)——路由器配置
- live555源代码简介
- 移动安全-iOS(三)
- python创建txt文件并写入-python如何将数据写入本地txt文本文件
- 书单 | 月度畅销好书,助你技能满格,摆脱低效,走向财富人生
- 整合spring-boot-starter-data-redis报错解决
- cad插件_CAD插件三领外挂7
- python 密度聚类_Python密度聚类算法-DBSCAN实践
- windows服务器重装教程,Win10系统怎么重装?Win10系统重装教程
- 【BZOJ】【P1135】【POI2009】【Lyz】【题解】【线段树+Hall定理】
- 超详细分解c 语言——实现扫雷游戏(详解)
- SEO外推福利:外链高收录平台与外链类型分析
- haribote bootpack.c 主任务程序代码阅读注释
- 【Matlab学习】
- Kubernetes--k8s---滚动更新--零停机不停服发布服务