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)相关推荐

  1. 从操作系统的PV操作理解JAVA的synchronized同步方法,同步代码块实现,及比较

    也有利于理解操作系统的同步 知识果然是息息相关的 JAVA同样离不开操作系统的原理,不过他体现在虚拟机JVM中 synchronized关键字是同步关键字 首先我们知道在操作系统里 PV两者操作信息量 ...

  2. 操作系统中PV操作之顾客理发师问题

    PV操作:对信号量进行相应操作 S:信号量 P:请求操作,相当于S=S-1:S>=0,进程继续进行 V:释放操作,相当于S=S+1,S>0,进程被唤醒 理发师问题 一个理发师,一把理发椅, ...

  3. 操作系统-PV操作-理发师问题

    操作系统-PV操作-理发师问题 前言 问题描述 解决思路 伪代码 总结 前言 hello,大家好,使用pv操作来实现进程的同步和互斥是我们本科授课的重点,同时也是研究生入学考试的重点考察题型.今天给大 ...

  4. java信号量生产者_java信号量PV操作 解决生产者-消费者问题

    package test1; /** * 该例子演示生产者和消费者的问题(设只有一个缓存空间.一个消费者和一个生产者) * MySystem类定义了缓冲区个数以及信号量 * @author HYY * ...

  5. 操作系统 | PV操作七大经典问题 生产者消费者 读者写者 哲学家进餐 理发师理发睡觉 和尚打水 吸烟者 吃水果

    一.生产者消费者问题 生产者消费者问题(英语:Producer-consumer problem),也称有限缓冲问题(英语:Bounded-buffer problem),是一个多线程同步问题的经典案 ...

  6. java pv操作_理解同步的PV操作

    PV操作是Edsger Dijkstra提出的一种经典的解决同步不同执行线程的问题的方法,这种方法是基于一种叫信号量的特殊变量来实现的. 简单理解为就是通过共享变量+信号量实现的一种同步机制,其应用与 ...

  7. java中的pv操作,PV操作简单理解

    进程通常分为就绪.运行和阻塞三个工作状态.三种状态在某些条件下可以转换,三者之间的转换关系如下: 进程三个状态之间的转换就是靠PV操作来控制的.PV操作主要就是P操作.V操作和信号量.其中信号量起到了 ...

  8. 操作系统pv操作学习总结

    PV操作 PV操作与信号量的处理相关,P表示通过的意思,V表示释放的意思. 目录 1 简介 2 详细资料 3 解释 ▪ 信号量的概念 ▪ 典型理解偏差 简介 1962年,狄克斯特拉离开数学中心进入位于 ...

  9. 试利用记录型信号量和pv操作写出_计算机操作系统知识点汇总

    1.基本特征 (1)并发:并发是指宏观上在一段时间内能同时运行多个程序,而并行则指同一时刻能运行多个指令.操作系统通过引入进程和线程使得程序能够并发运行: (2)共享:共享是指系统中的资源可以被多个并 ...

最新文章

  1. 如何用hover写出顺畅的动态效果
  2. Symantec:揭秘Hidden Lynx组织的APT***行动
  3. 线性最小二乘问题求解的豪斯荷尔德法C实现
  4. 访问者(Visitor)模式
  5. H5移动端页面设计心得分享
  6. 计算机网络实验(思科模拟器Cisco Packet Tracer)——路由器配置
  7. live555源代码简介
  8. 移动安全-iOS(三)
  9. python创建txt文件并写入-python如何将数据写入本地txt文本文件
  10. 书单 | 月度畅销好书,助你技能满格,摆脱低效,走向财富人生
  11. 整合spring-boot-starter-data-redis报错解决
  12. cad插件_CAD插件三领外挂7
  13. python 密度聚类_Python密度聚类算法-DBSCAN实践
  14. windows服务器重装教程,Win10系统怎么重装?Win10系统重装教程
  15. 【BZOJ】【P1135】【POI2009】【Lyz】【题解】【线段树+Hall定理】
  16. 超详细分解c 语言——实现扫雷游戏(详解)
  17. SEO外推福利:外链高收录平台与外链类型分析
  18. haribote bootpack.c 主任务程序代码阅读注释
  19. 【Matlab学习】
  20. Kubernetes--k8s---滚动更新--零停机不停服发布服务

热门文章

  1. angular2--怎么删除数组中的某个元素
  2. 一个屌丝程序猿的人生(十二)
  3. java程序员的日常小感悟
  4. python 奶茶店信息管理1.0
  5. 软件测试面试合集,测试/测试开发岗面经,看完还不怕找不到工作
  6. vr技术在民宿中的应用,让民宿更具特色,更有活力
  7. c语言 浮点数的加减乘除,浮点数的加减乘除运算步骤
  8. 公众号开发(二)--菜单管理
  9. 如何让动效又快又好落地?我分析了这5种格式的优缺点
  10. 2021.10.13会议记录