0 0

java如何效率的解决这个抢房间座位问题0

假设有10个房间,每个房间有5个座位。这些座位可能是空的,也可能坐着人,房间外面有大量的人等待空位,房间内的人可能随时离开,因此要不停的扫描房间空位一旦有空的就抢座上去。

目前的难点,首先要保证线程同步,不能一个座位放上去两个人,其次就是要保证速度,线程同步要加锁,加锁就影响效率。

我目前考虑的方法是用hashmap代表一个房间的5个位置,但是这样检查空位和坐上去这两个动作都要加锁,感觉效率很低,10个房间还好说,1000个房间呢
2014年3月19日 09:33

5个答案 按时间排序 按投票排序

0 0

我觉得你的这个问题类似生产者消费者的问题

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
0 0

如果你不需要区分5个座位,就用信号量;如果你需要区分,就使用对象池,对象池的acquire和release可以简单地用blockingqueue来做,当然你有其他对象池实现也可以。

2014年3月19日 16:43
0 0

使用线程的同步, wait-notifyAll的机制就行吧.

2014年3月19日 12:49
0 0

http://www.infoq.com/cn/articles/High-Performance-Java-Inter-Thread-Communications
直接看这个吧,无锁模型的实现,肯定能满足你的需求。同时,还提供目前很流行的相应解决方案!

2014年3月19日 11:36
0 0

为毛要扫描?
为毛不能在某人离开座位的时候告知排队的人,下一个进来吧。

事件驱动+队列。应该可以解决问题了。

2014年3月19日 10:20

相关推荐

    JAVA完整餐饮管理系统

    “异洲酒店管理系统”可能是这个Java餐饮管理系统的一个实例,它可能针对酒店餐饮服务进行了特别定制,包含房间预订、宴会预定、餐饮服务等功能,以满足酒店综合业务需求。 总结,Java完整餐饮管理系统通过先进的...

    毕业论文ssm542基于JAVA的图书馆预约占座系统+vue论文.doc

    图书馆预约占座系统、房间管理、房间占座,这些关键词反映了论文的核心内容,强调了系统在解决图书馆座位预约问题上的重要角色。 通过本系统,图书馆的信息管理得到了显著改善,信息处理更为规范和系统,提高了服务...

    基于Android的图书馆座位查询系统.docx

    【基于Android的图书馆座位查询系统】是一个利用计算机技术、人体红外感应模块和数据库技术,针对图书馆座位管理问题设计的智能系统。系统通过Android平台移动端,实现了实时查询图书馆空位信息的功能,有效地减少了...

    答辩pptssm542基于JAVA的图书馆预约占座系统+vueppt.pptx

    【图书馆预约占座系统】是一个基于JAVA技术和SSM框架构建的在线服务平台,旨在解决图书馆座位预约和管理的问题。系统利用Web技术,使用户能够在任何智能设备上通过浏览器进行操作,打破了地理位置的限制,提升了信息...

    Eclipse酒店管理系统(java)宣贯.pdf

    《Eclipse酒店管理系统(java)宣贯.pdf》是一份详细阐述基于Java开发的酒店管理系统的文档,涵盖了系统设计、需求分析和数据库逻辑设计等多个方面。本文将深入解析其中的关键知识点。 首先,文档的序言部分明确了...

    Eclipse酒店管理系统(java).docx

    - **概念设计**:这一阶段主要确定数据实体及其关系,例如客户信息表、房间信息表、订单信息表等,构建初步的数据模型。 - **逻辑设计**:在概念设计的基础上,进一步细化表结构,设置字段类型、长度、约束等,以...

    SSM+Vue图书馆预约占座系统答辩PPT.pptx

    该项目旨在为图书馆提供一个便捷的线上预约和管理座位的平台,以适应现代社会对互联网技术的依赖。 **研究背景与意义** 随着互联网技术的快速发展,各行各业都在寻求与之融合的方式,以提升工作效率和生活质量。...

    springboot自习室预订系统完整论文

    【自习室预订系统】是一种基于互联网技术的智能化管理系统,它旨在解决传统自习室预定的不便,提高学生使用自习资源的效率。随着网络的飞速发展,人们越来越依赖于网络服务,自习室预订系统应运而生,以满足个性化...

    Cinema-Room-Manager:剧院管理的简单应用

    1. **剧院和房间管理**:系统能够管理多个剧院及其对应的放映厅,记录每个房间的座位布局和容量。 2. **电影和放映时间安排**:用户可以添加电影信息,并设置不同时间段的放映计划,以便观众选择合适的场次。 3. *...

    8008123328-甘鑫轩-2312班-酒店管理系统.zip

    4. 餐饮管理:提供菜单展示,接受点餐订单,管理餐厅座位和预订,以及处理账单。 5. 财务管理:自动计算并记录各项收入和支出,生成财务报表,为决策提供数据支持。 6. 员工管理:包括员工考勤、权限分配、任务...

Global site tag (gtag.js) - Google Analytics