多个部门厕所排队问题

场景:公司有若干部门,每个部门一个厕所,每个部门的员工争抢本部门的厕所

 

import java.util.Map;
import java.util.Random;
import java.util.concurrent.ConcurrentHashMap;

/**
* @comments 测试main入口
* 场景:公司有若干部门,每个部门一个厕所,每个部门的员工争抢本部门的厕所
* @author Bruce
* @date 2017年11月24日
*/
public class ToiletTester {
	//总人数
	private static final int personNum = 30;
	//所有部门的厕所
	public static Map<Integer, Toilet> DepToilets = new ConcurrentHashMap<>();

	public static void main(String[] args) {
		
		for (int i = 1; i <= personNum; i++) {
			int depId = randomRange(5, 1);//为员工随机分配部门id(从1到5)
			String empName = fixedLengthFill0(3, i) + " 号员工";
			Person person = new Person(depId, empName);
			person.start();
		}

	}

	//------------- 工具方法  ------------------------------
	public static Integer randomRange(int max, int min) {
		return new Random().nextInt(max)%(max-min+1) + min;
	}
	private static String fixedLengthFill0(int length, int seq) {
		StringBuilder strBu = new StringBuilder();
		int fillLen = length - String.valueOf(seq).length();
		for (int i = 0; i < fillLen; i++) {
			strBu.append("0");
		}
		strBu.append(seq);
		return strBu.toString();
	}
}

 

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
* @comments 执行的业务方法(被调用的)
* @author Bruce
* @date 2017年11月24日
*/
public class Toilet {
	
	private Integer depId;
	
	private Lock lock = new ReentrantLock(true);
    
	public Toilet(Integer depId) {
		this.depId = depId;
	}
	public void enter() {
		try {
			lock.lock();//拿到锁(锁门)
			System.out.println(Thread.currentThread().getName() + "获得Toilet-DEP"+depId+" 使用权,time:" + System.currentTimeMillis());
			int sec = ToiletTester.randomRange(3, 1);
			Thread.sleep(sec * 1000);//使用1-3秒
		} catch (InterruptedException e) {
			e.printStackTrace();
		} finally {
			lock.unlock();//释放锁(完事了,开门出去)
		}
		
	}

	//-------------- get & set methods -----------
	public Integer getDepId() {
		return depId;
	}

	public void setDepId(Integer depId) {
		this.depId = depId;
	}
	public Lock getLock() {
		return lock;
	}
	
}

 

/**
* @comments 业务调用者
* @author Bruce
* @date 2017年11月24日
*/
public class Person extends Thread{
	
	private Integer depId;//部门id
	
	private String empName;//员工姓名
	
	public Person(Integer depId, String empName) {
		this.setName("DEP" + depId + "-" + empName);
		this.depId = depId;
		this.empName = empName;
	}

	@Override
	public void run() {
		//如果没有厕所就建立个部门厕所
		ToiletTester.DepToilets.putIfAbsent(depId, new Toilet(depId)); 
		//员工根据所在部门id找到部门的厕所
		Toilet toilet = ToiletTester.DepToilets.get(depId);
		toilet.enter();//进入
		super.run();
	}
	
	//-------------- get & set methods ---------------------------
	public String getEmpName() {
		return empName;
	}

	public void setEmpName(String empName) {
		this.empName = empName;
	}

	public Integer getDepId() {
		return depId;
	}

	public void setDepId(Integer depId) {
		this.depId = depId;
	}
	
}

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
作为AI机器人,我可以给出思路和建议。具体实现过程需要开发者根据自己的能力进行开发。 1.用户界面设计 确定界面的主题及设计风格,方便用户快速找到喜欢的厕所、查看厕所的评价等。页头上要放置定位按钮,方便用户查找周围的厕所位置,同时还要有搜索框,输入关键词后进行搜索。 2.地图接口 使用地图API来定位用户所在的位置,同时也可以展现附近的厕所。当用户点击某个厕所时,地图界面可以将其详细信息(例如地址、评分等)展现出来。 3.数据接口 可以从腾讯地图、高德地图等接口获取厕所的位置、评分、开放时间等信息,同时还可以将用户上传的评价和图片进行保存和共享,便于其他用户参考。 4.评价功能 应用程序中要包含用户评价功能,方便用户对已访问过的厕所进行评价。评价内容包括卫生状况、服务水平、便利程度等,同时也可以上传图片或视频进行展示。 5.虚拟导航 在地图上进行导航,引导用户到达目的地,同时系统还能提供路线规划功能,预计到达时间,路程等信息方便用户选择。 6.营销推广 应用程序还可通过推广的方式提高用户关注度,例如发布促销、折扣优惠等信息,提供VIP服务,建立会员体系等。 以上是一个找厕所的应用程序的基本思路和建议,但具体实现还需要根据实际开发过程中遇到的问题不断调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值