`

简单web 排队器

阅读更多

知识点:

1、1.5以上的线程池

2、阻塞队列

 

实现:

1、排号器(队伍)

import java.util.concurrent.ArrayBlockingQueue;

/**
 * 排队器
 * 
 * @author luoqinglong
 * @date 2014-3-23
 */
public class BuyQueue extends ArrayBlockingQueue<String>
{

	/**
	 * @param capacity
	 */
	public BuyQueue(int capacity)
	{
		super(capacity);
		// TODO Auto-generated constructor stub
	}

}

 

2、控制类

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.Callable;
import java.util.concurrent.Future;

/**
 * 会员控制器
 * 
 * @author luoqinglong
 * @date 2014-3-23
 */
public class MemberAction
{
	/**
	 * 提交订单
	 */
	public void saveOrder(final String memberId)
	{
		// TODO INSERT DB
		try
		{
			// 排队
			Test.getBuyQueue().put(memberId);
		}
		catch (InterruptedException e)
		{
			e.printStackTrace();
		}
		// 增加排队人携带的任务
		Future<Map<String, Object>> map = Test.getExecutorService().submit(new Callable<Map<String, Object>>()
		{
			@Override
			public Map<String, Object> call() throws Exception
			{
				Map<String, Object> map = new HashMap<String, Object>();
				OrderService orderService = new OrderService();
				orderService.dealOrder();
				return map;
			}
		});

	}
}

 

3、业务类

public class OrderService
{
	/**
	 * 按照会员下单的顺序处理订单
	 */
	public synchronized void dealOrder()
	{
		String memberId = Test.getBuyQueue().poll();
		System.out.println("开始处理订单,会员号: " + memberId);
		try
		{
			// 模拟业务处理时长
			Thread.sleep(1000);
		}
		catch (InterruptedException e)
		{
			e.printStackTrace();
		}
		System.out.println("---处理完成订单,会员号: " + memberId);
		if (Test.getBuyQueue().size() == 0)
		{
			Test.getExecutorService().shutdown();
		}
	}
}

 

4、测试类

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * @author luoqinglong
 * @date 2014-3-23
 */
public class Test
{
	private static ExecutorService executor = null;

	private static BuyQueue buyQueue = null;

	/**
	 * @param args
	 */
	public static void main(String[] args)
	{
		for (int i = 0; i < 100; i++)
		{
			MemberAction action = new MemberAction();
			action.saveOrder(i + 1 + "");
		}
	}

	public static synchronized ExecutorService getExecutorService()
	{
		if (Test.executor == null)
		{
			Test.executor = Executors.newFixedThreadPool(3);
		}
		return Test.executor;
	}

	public static synchronized BuyQueue getBuyQueue()
	{
		if (Test.buyQueue == null)
		{
			Test.buyQueue = new BuyQueue(10);
		}
		return Test.buyQueue;
	}
}

 

需完善的地方:

1、防止重复排队

2、针对不同的业务使用多个排队器

 

分享到:
评论

相关推荐

    基于排队论的嵌入式Web 系统性能优化.pdf

    这些设备通常拥有有限的计算能力和存储空间,但能够提供简单的Web服务,方便用户通过网络对其进行访问和控制。 #### 三、研究方法与实施步骤 ##### 1. 嵌入式Web系统架构分析 - **开发平台**:本研究选择基于ARM7...

    用socket实现的最简单的web服务器示例

    本示例将深入讲解如何使用Python的socket库来实现一个最简单的Web服务器。这个服务器能够响应HTTP请求,并返回固定的内容,对于初学者理解Web服务器的工作原理非常有帮助。 首先,我们需要了解Web服务器的基本工作...

    排队论 Ivo Adan

    M/M/1是排队论中最简单且基础的模型之一,表示单一服务员(或服务器)的系统。它涉及时间依赖行为、极限行为、平均性能度量、逗留时间与等待时间分布、优先级策略(包括抢占式和非抢占式),以及忙碌期的分析。M/M/1...

    wtem.rar_排队

    例如,在Web服务器中,可以通过智能的排队策略来平衡请求处理,防止过载;在网络传输中,TCP/IP协议栈就使用了类似的思想来控制数据包的发送速率,避免拥塞。 总的来说,"wtem.rar_排队"提供的内容可能是针对这些...

    spring boot+mybatis开发海底捞的排队系统

    当时给客户写都一个简单都预约排队系统,后台管理员输入排队号,人数,当前叫号, 运行环境 jdk8+mysql+IntelliJ IDEA+maven+mybatis 项目技术(必填) springboot+mysql+mybatis+bootstrap+jquery ...

    JBPM4 web设计器实践--命令模式的使用

    【描述】"简单集成的效果示例"暗示了在JBPM4的web设计器中,通过命令模式实现的功能集成能够直观地展示出其优势。这可能包括了简化流程编辑、保存和撤销操作,以及与其他系统(如数据库或工作流引擎)的无缝连接。博...

    Request_queu_System1.1.zip_queuing_排队系统

    请求排队系统1.1是一个基于Java Web开发的简易应用程序,主要功能是管理并有序处理用户的请求。这个系统采用了一个基本的队列数据结构,确保所有请求按照先进先出(FIFO)的原则进行处理,避免了资源的竞争和无序...

    nginx+lua+php+redis实现单业务排队系统架构.zip

    诞生于1995年,由Rasmus Lerdorf创建,PHP最初用于简单的网页动态处理,如今已发展成为一款功能齐全、生态丰富的全栈开发工具,支持从网站前端交互到后端业务逻辑、数据库操作乃至API接口开发的全方位需求。...

    WEB课程设计:教室预定系统

    现在在学校里,预订教室需要填申请表,还要按时去报到排队确认,这些手续过于繁琐,所以我们想开发一个教室预订系统来简化预订教室的繁琐流程。在这篇报告中,介绍了我们开发的这个友好的教室预订系统,我们的系统的...

    同城跑腿配送系统uniapp+web端

    "同城跑腿配送系统uniapp+web端"就是这样一个解决方案,旨在为用户提供便捷、高效的同城配送服务,包括帮取、帮送、帮买、帮排队、帮办事等一系列个性化服务。 一、uniapp框架详解 uniapp是一款基于Vue.js开发的多...

    taskqueue:简单的排队服务在联网机器之间划分工作

    Taskqueue 是一种简单的排队服务,用于在联网机器之间划分工作。 Taskqueue 的概念在 RabbitMQ 的教程中得到了完美的解释: 工作队列(又名:任务队列)背后的主要思想是避免立即执行资源密集型任务而不得不等待它...

    WEB打印控件LODOP

    LODOP技术主要基于JavaScript,允许开发者通过简单的脚本语言实现复杂的打印功能,提高了Web应用的用户体验。 在描述中提到的"采用6.0",这可能指的是LODOP控件的一个特定版本,通常每个新版本都会带来性能优化、新...

    C#使用队列(Queue)解决简单的并发问题

    在本文中,我们将深入探讨如何使用C#中的队列数据结构(Queue)来解决简单的并发问题。队列是一种线性数据结构,遵循先进先出(FIFO)的原则,即第一个进入的元素也将是第一个离开的元素。这种特性使得队列在处理...

    综合-模拟市政务中心排队叫号服务系统-Python源码示例.zip

    1. **Python编程**:Python是一种高级编程语言,以其简洁明了的语法和丰富的库支持而被广泛应用于各种项目,包括Web开发、科学计算、自动化任务和数据分析。在这个项目中,Python被用来构建整个排队叫号服务系统,...

    Java语言实现支持视频点播的WEB服务器.doc

    在这个服务器中,每个用户的连接在请求完成后会被断开,新的请求需要重新排队,这种方式有助于防止大页面占用过多网络资源。 在数据库方面,项目选择了微软的ACCESS数据库,适用于小型社区服务器。如果在LINUX平台...

    基于ssm+vue+web办事大厅政务预约系统源码数据库文档.zip

    3. **Spring MVC**:Spring MVC是Spring框架的一部分,它是一个基于模型-视图-控制器(MVC)架构的Web应用框架,用于处理HTTP请求并返回相应的视图。 4. **MyBatis**:MyBatis是一个轻量级的持久层框架,它允许...

    springboot基于AOP将web请求写入日志

    本教程将引导新手理解如何利用AOP来记录Web请求日志。下面将详细阐述这个过程。 首先,我们需要了解AOP的基本概念。AOP允许我们在程序执行过程中,在特定的“连接点”(例如方法调用)上插入自定义的行为,这些行为...

    actix-web-单线程

    总之,Actix-web 的单线程模式提供了一种简单而有效的启动方式,适合轻量级应用或初始开发。然而,对于高并发场景,推荐使用多线程或多工作进程模式,以充分发挥 Rust 异步编程的优势和硬件资源。通过深入理解和熟练...

    基于JSP+SSM的银行排队叫号系统毕业设计(源码+开发说明+演示视频).zip

    《基于JSP+SSM的银行排队叫号系统毕业设计》是一个典型的Web应用程序,它采用Java作为主要开发语言,结合Spring、SpringMVC和MyBatis(SSM)三大框架构建了一个B/S架构的系统。这个系统旨在模拟银行的排队叫号流程,...

Global site tag (gtag.js) - Google Analytics