-
java如何效率的解决这个抢房间座位问题0
假设有10个房间,每个房间有5个座位。这些座位可能是空的,也可能坐着人,房间外面有大量的人等待空位,房间内的人可能随时离开,因此要不停的扫描房间空位一旦有空的就抢座上去。
目前的难点,首先要保证线程同步,不能一个座位放上去两个人,其次就是要保证速度,线程同步要加锁,加锁就影响效率。
我目前考虑的方法是用hashmap代表一个房间的5个位置,但是这样检查空位和坐上去这两个动作都要加锁,感觉效率很低,10个房间还好说,1000个房间呢2014年3月19日 09:33
5个答案 按时间排序 按投票排序
-
我觉得你的这个问题类似生产者消费者的问题
java.util.concurrent包是java解决并发问题的大部分api,
里面提供了LinkedBlockingQueue,方便实现生产者消费者
注:多线程里sysou的顺序不一定是真是的顺序
import java.util.Random; import java.util.UUID; import java.util.concurrent.BlockingQueue; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.LinkedBlockingQueue; /** * * * 描述: 假设有10个房间,每个房间有5个座位。这些座位可能是空的,也可能坐着人,房间外面有大量的人等待空位,房间内的人可能随时离开, * 因此要不停的扫描房间空位一旦有空的就抢座上去。 创建人:田超 创建时间:2014-3-19 下午4:34:32 * */ public class MultiRoomSeatCompetition { private static int roomCount = 10; public static void main(String[] args) { // 所有房间的数组集合 LinkedBlockingQueue<String>[] roomArray = new LinkedBlockingQueue[roomCount]; for (int i = 0; i < roomCount; i++) { roomArray[i] = new LinkedBlockingQueue<String>(5); } System.out .println("创建了" + roomArray.length + "个房间-------------------。"); // System.out.println(roomArray[0].size()); Consumer c11 = new Consumer("消费者01号", roomArray,roomCount); Producer p11 = new Producer("生产者01号", roomArray,roomCount); Producer p22 = new Producer("生产者02号", roomArray,roomCount); Producer p33 = new Producer("生产者03号", roomArray,roomCount); Producer p44 = new Producer("生产者04号", roomArray,roomCount); Producer p55 = new Producer("生产者05号", roomArray,roomCount); Producer p66 = new Producer("生产者06号", roomArray,roomCount); Producer p77 = new Producer("生产者07号", roomArray,roomCount); Producer p88 = new Producer("生产者08号", roomArray,roomCount); Producer p99 = new Producer("生产者09号", roomArray,roomCount); ExecutorService service = Executors.newCachedThreadPool(); service.submit(c11); service.submit(p11); service.submit(p22); service.submit(p33); service.submit(p44); service.submit(p55); service.submit(p66); service.submit(p77); service.submit(p88); service.submit(p99); } } /** * 生产者 (排队的人 :类似生产者的产品) */ class Producer implements Runnable { private String pname; private LinkedBlockingQueue[] roomArray; private int roomCount; public Producer(String pname, LinkedBlockingQueue[] roomArray,int roomCount) { this.pname = pname; this.roomArray = roomArray; this.roomCount = roomCount; } public void run() { try { while (true) { UUID productID = UUID.randomUUID(); Random r = new Random(); int i = r.nextInt(roomCount); boolean isEnter = roomArray[i].offer(String.valueOf(productID)); if (isEnter) { System.out.println("在" + i + "号房排队的" + productID + "已经进入" + i + "号房,房间里现在有" + roomArray[i].size() + "个人"); } // Thread.sleep(500); } } catch (Exception e1) { e1.printStackTrace(); } } } /** * 消费者 :将房间里的人取走的线程 */ class Consumer implements Runnable { private String cname; private LinkedBlockingQueue[] roomArray; private int roomCount; public Consumer(String cname, LinkedBlockingQueue[] roomArray,int roomCount) { this.cname = cname; this.roomArray = roomArray; this.roomCount = roomCount; } public void run() { try { while (true) { Random r = new Random(); int i = r.nextInt(roomCount); String product = (String) roomArray[i].take(); System.out.println(product + "已经离开了" + i + "号房,房间里现在有" + roomArray[i].size() + "个人"); Thread.sleep(5000); } } catch (InterruptedException e) { e.printStackTrace(); } } }
2014年3月19日 16:56
-
如果你不需要区分5个座位,就用信号量;如果你需要区分,就使用对象池,对象池的acquire和release可以简单地用blockingqueue来做,当然你有其他对象池实现也可以。
2014年3月19日 16:43
-
http://www.infoq.com/cn/articles/High-Performance-Java-Inter-Thread-Communications
直接看这个吧,无锁模型的实现,肯定能满足你的需求。同时,还提供目前很流行的相应解决方案!2014年3月19日 11:36
相关推荐
“异洲酒店管理系统”可能是这个Java餐饮管理系统的一个实例,它可能针对酒店餐饮服务进行了特别定制,包含房间预订、宴会预定、餐饮服务等功能,以满足酒店综合业务需求。 总结,Java完整餐饮管理系统通过先进的...
图书馆预约占座系统、房间管理、房间占座,这些关键词反映了论文的核心内容,强调了系统在解决图书馆座位预约问题上的重要角色。 通过本系统,图书馆的信息管理得到了显著改善,信息处理更为规范和系统,提高了服务...
【基于Android的图书馆座位查询系统】是一个利用计算机技术、人体红外感应模块和数据库技术,针对图书馆座位管理问题设计的智能系统。系统通过Android平台移动端,实现了实时查询图书馆空位信息的功能,有效地减少了...
【图书馆预约占座系统】是一个基于JAVA技术和SSM框架构建的在线服务平台,旨在解决图书馆座位预约和管理的问题。系统利用Web技术,使用户能够在任何智能设备上通过浏览器进行操作,打破了地理位置的限制,提升了信息...
《Eclipse酒店管理系统(java)宣贯.pdf》是一份详细阐述基于Java开发的酒店管理系统的文档,涵盖了系统设计、需求分析和数据库逻辑设计等多个方面。本文将深入解析其中的关键知识点。 首先,文档的序言部分明确了...
- **概念设计**:这一阶段主要确定数据实体及其关系,例如客户信息表、房间信息表、订单信息表等,构建初步的数据模型。 - **逻辑设计**:在概念设计的基础上,进一步细化表结构,设置字段类型、长度、约束等,以...
该项目旨在为图书馆提供一个便捷的线上预约和管理座位的平台,以适应现代社会对互联网技术的依赖。 **研究背景与意义** 随着互联网技术的快速发展,各行各业都在寻求与之融合的方式,以提升工作效率和生活质量。...
【自习室预订系统】是一种基于互联网技术的智能化管理系统,它旨在解决传统自习室预定的不便,提高学生使用自习资源的效率。随着网络的飞速发展,人们越来越依赖于网络服务,自习室预订系统应运而生,以满足个性化...
1. **剧院和房间管理**:系统能够管理多个剧院及其对应的放映厅,记录每个房间的座位布局和容量。 2. **电影和放映时间安排**:用户可以添加电影信息,并设置不同时间段的放映计划,以便观众选择合适的场次。 3. *...
4. 餐饮管理:提供菜单展示,接受点餐订单,管理餐厅座位和预订,以及处理账单。 5. 财务管理:自动计算并记录各项收入和支出,生成财务报表,为决策提供数据支持。 6. 员工管理:包括员工考勤、权限分配、任务...