使用优先队列实现游戏公告模块(Java)

本文介绍了一种基于优先级的公告消息推送系统的设计与实现。系统采用优先级队列存储公告,确保高优先级消息能优先被推送。通过定时任务检查并推送最高优先级的公告,同时考虑了消息的时间顺序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.问题描述

**实现公告消息分优先级,优先级高的公告,优先推送,同一优先在其后面加入.有点像是队列里面的分组还是队列的数据结构.

思路首先使用优先级做队列,然后根据时间戳做队列.然后定期推送.如果优先级高者加入,立刻推送,并将未播放完的公告加入队列.**

二.相关的类和方法的实现

Notice类:公告的消息体

/**
 * 公告信息体
 * 
 * @author insping
 *
 */
public class Notice {
    int priorLevel; // 优先级
    long time; // 消息的时间戳
    Object obj; // 公告体,可以是任意对象

    public Notice() {

    }

    public Notice(int priorLevel, long time, Object obj) {
        this.priorLevel = priorLevel;
        this.time = time;
        this.obj = obj;
    }

    public int getPriorLevel() {
        return priorLevel;
    }

    public void setPriorLevel(int priorLevel) {
        this.priorLevel = priorLevel;
    }

    public long getTime() {
        return time;
    }

    public void setTime(long time) {
        this.time = time;
    }

    public Object getObj() {
        return obj;
    }

    public void setObj(Object obj) {
        this.obj = obj;
    }

}

NoticeManager类:公告的管理类

import java.util.Comparator;
import java.util.PriorityQueue;

public class NoticeManager {
    private static NoticeManager instance = new NoticeManager();

    public static NoticeManager getInstance() {
        return instance;
    }

    public PriorityQueue<Notice> worldNotices = new PriorityQueue<Notice>(11, new Comparator<Notice>() {
        @Override
        public int compare(Notice o1, Notice o2) {
            int numbera = o1.getPriorLevel();
            int numberb = o2.getPriorLevel();
            long timea = o1.getTime();
            long timeb = o2.getTime();
            return numberb == numbera ? (timea == timeb ? 0 : (timea < timeb ? -1 : 1)) : (numbera > numberb ? -1 : 1);
        }
    });// 世界公告
    long noticeStart = System.currentTimeMillis(); // 公告消息的时间
    Notice priorNotice = new Notice();// 用作记录上次所发送的公告

    /**
     * 发送一条公告消息(优先展示)
     * 
     * @param msg
     */
    public void addNotice(Notice noticeMsg) {
        synchronized (worldNotices) {
            worldNotices.add(noticeMsg);
            if (noticeMsg.getPriorLevel() > priorNotice.getPriorLevel() && priorNotice.getTime() != 0) {
                worldNotices.add(priorNotice);
                noticeStart = 0; // 让头数据立刻下发
            }
        }
    }

    /**
     * 推送一条公告消息
     */
    public boolean sendHeadWorldNotice() {
        synchronized (worldNotices) {
            Notice noticeMsg = worldNotices.poll();
            if (noticeMsg == null) {
                return false;
            }
            priorNotice = noticeMsg;
            // 想所有在线的玩家推送notice
            // sendToAllRole(noticeMsg);
            System.out.println(noticeMsg.getObj()); //做测试显示.
            return true;
        }
    }

    /**
     * 定期向所有在线的用户 发送公告消息
     */
    public boolean sendHeadWorldNoticeToAllOnlineRoles() {
        // 刷新公告信息
        synchronized (worldNotices) {
            if (worldNotices.size() > 0 && System.currentTimeMillis() - noticeStart >= 20 * 1000) {
                if (!sendHeadWorldNotice()) {
                    return false;
                }
                noticeStart = System.currentTimeMillis();
                return true;
            }
            return false;
        }
    }
}

NoticeThread类:公告线程


public class NoticeThread extends Thread implements Instance {
    @Override
    public void run() {
        while (1 != 0) // !ServiceApp.FREEZE 可以判断服务的状态
            try {
                noticeMgr.sendHeadWorldNoticeToAllOnlineRoles();
            } catch (Exception e) {
                System.out.println(e);
            }
    }
}

Instance接口


public interface Instance {
    public static final NoticeManager noticeMgr = NoticeManager.getInstance();
}

测试程序:

    public static void main(String args[]) throws InterruptedException {
        NoticeThread noticeThread = new NoticeThread();
        noticeThread.start();
        Notice noticeMsg = new Notice(2,System.currentTimeMillis(), (Object) 1);
        noticeMgr.addNotice(noticeMsg);
        noticeMgr.sendHeadWorldNotice();
        Thread.sleep(1000);
        Notice noticeMsg1 = new Notice(1, System.currentTimeMillis(), (Object) 2);
        noticeMgr.addNotice(noticeMsg1);
        Thread.sleep(1000);
        Notice noticeMsg2 = new Notice(2, System.currentTimeMillis(), (Object) 4);
        noticeMgr.addNotice(noticeMsg2);
        Thread.sleep(1000);
        Notice noticeMsg3 = new Notice(3, System.currentTimeMillis(), (Object) 3);
        noticeMgr.addNotice(noticeMsg3);
        }

结果:
1
3
1
4
2

运行环境 操作系统:Windows XP。 Java平台:JDK 1.5。 Web服务器:Tomcat v 5.5.23,下载地址:http://tomcat.apache.org/。 数据库服务器:MySQL v 5.0.45,下载地址:http://www.mysql.com/。 开发平台:Eclipse SDK v 3.2.2,下载地址:http://www.eclipse.org/download/index.jsp。 Eclipse插件TomcatPlugins v 3.2.1,下载地址:http://www.eclipse-plugins.info/eclipse/index.jsp。 Eclipse插件ResourceBundleEditor v 0.7.7,下载地址:http://resourcebundleeditor.com/。 Eclipse插件MyEclipse v 5.5.1,下载地址:http://www.myeclipseide.com/ Spring 采用 2.0 版本 Hibernate 采用3.0版本 ============================ 请注意:如出现中文乱码,检查如下配置是否正确。 (1)MySql 数据库是否是utf-8 格式(在安装时选择支持多语言),数据是否正常。 (2)项目是否为utf-8格式(同时看看的源代码文件中,中文是否乱码)。 (3)JSP页面是否是utf-8 格式。 (4)在web.xml 是否配置了编码过滤器。 (5)数据源配置的url(?useUnicode=true&characterEncoding=UTF-8),具体请看项目实例。 如果上面5步都没问题,你就不存在中文乱码问题。 ============================== 数据库使用的是MySQL,其版本为5.0.45 版本。 数据库的用户名及密码均为root。 使用的时候,请参考附件数据库导入一节。或将需要用到的某章的数据库目录复制到“mysql安装根目录\data”文件夹下就可以了。
### 一、工作目的 ​ 随着电子商务和网络购物的快速发展,快递业务量呈现爆发式增长。但是,现今的快递代收点不但种类多、分布散乱,容易出现包裹损坏、快件丢失、个人信息泄露等问题,导致用户对快递末端配送服务的满意度极低。本课题旨在设计并实现一个社区快递代取服务系统,通过建立智能化的快递管理平台,优化快递领取流程,减轻快递员的工作负担,提升社区居民的便利性和满意度。系统将集成注册登录、包裹管理、通知提醒、用户评价等功能,提供一站式快递代取服务。 ### 二、工作内容及具体要求 ​ 社区快递代取服务系统的设计主要分普通用户、兼职代取用户、管理员三种身份,分别实现不同身份下的功能及界面设计: 1. **普通用户**:主要实现包括注册与登录、个人中心、公告咨询、快递代取服务模块、通知提醒、评价反馈等功能模块。 - **注册与登录**:用户通过手机号等方式注册账号。 - **个人中心**:查看和修改个人信息,包括姓名、昵称、联系方式、收货地址等。 - **公告咨询**:公布附近快递站点等信息。 - **快递代取服务模块**: - 提交代取申请(选择代取时间和地点,录入包裹信息,包括快递公司、运单号等); - 查看代取记录(代取时间、代取人等); - 快递状态跟踪:实时更新包裹的状态,包括到达快递点、代取中、已领取等。 - **通知提醒**: - 快递到达通知,当包裹到达快递点时,系统自动发送通知给用户; - 代取成功通知,包裹被代取成功后,系统发送通知给用户; - ~~自定义提醒,用户可以设置个性化提醒,如重要包裹到达提醒等。~~ - **评价反馈**: - 对代取服务进行评价,用户可以对代取服务进行评价,填写满意度和反馈意见; - 提交投诉,用户可以在线提交投诉,系统记录并转交相关人员处理。 2. **兼职代取用户**:主要实现包括账号申请、个人中心(评分)、快递信息管理、代取服务、通知提醒等功能。 - **快递信息管理**: - 录入包裹信息(快递公司、运单号、收件人信息等)。 - 更新包裹状态(到达快递点、代取中、已领取等) - **代取服务**: - 查看并确认用户的代取申请; - 更新代取记录(代取时间、代取人、领取人等)。 - **通知提醒** 3. **管理员**:主要实现用户管理、兼职用户管理、公告资讯管理、代拿任务管理、快递信息管理、反馈管理、可视化统计等功能模块。 可选功能:智能分配任务(根据地址)、服务信誉评级、语音助手交互、特殊物品取件、取件预约等 。 ### 工作进度分配 第1~2周:查看书籍,相关文献等,详细分析系统开发需求,完成开题报告和开题答辩。 第3~4周:学习Java等相关开发语言及框架,并完成系统概要及详细设计。 第5~6周:完成系统普通用户相关功能的实现及界面设计,构思整体框架。 第7~8周:编写代码实现兼职代取用户相关功能及界面设计。 第9~10周:编写代码实现管理员相关功能及界面设计。 第11~12周:对系统代码进行完善和调试,保证运行准确无误,初步撰写毕业论文。 第13~14周:撰写并完成毕业论文和ppt,准备答辩。 根据这份论政书,我希望实现这个系统,其中可选功能部分,我只选择根据地址智能分配任务。请你根据以上内容,帮我规划,包括该系统从无到有的全部过程,分析设计等待过程都要有。 我目前暂未学习过java语言相关的技术,但是学习过c++的qt框架,前端:采用HTML、css、javascript等技术 数据库:采用mysql实现 后端:基于java语言结合springboot框架开发,请你给出技术栈适合我这样的java新手来开发
最新发布
03-13
<think>好的,我现在需要帮用户规划一个社区快递代取服务系统的开发过程,并且给出适合他技术栈的建议。用户已经提供了详细的工作目的、内容、进度分配,以及技术选型:前端用HTML/CSS/JavaScript,后端用Java+Spring Boot,数据库用MySQL。他学过C++的Qt,但没学过Java,需要适合新手的建议。 首先,我需要理解用户的需求。系统有三个角色:普通用户、兼职代取用户和管理员。主要功能包括注册登录、包裹管理、通知提醒、评价反馈等,可选功能是智能分配任务。用户作为Java新手,可能需要一个结构清晰、容易上手的技术栈,同时结合他已有的前端和数据库知识。 接下来,我应该考虑整个系统从无到有的过程,包括需求分析、设计、开发、测试等阶段。用户已经分好了14周的工作进度,可能需要更详细的任务分解,尤其是在学习阶段和开发阶段如何分配时间。 技术栈方面,用户后端使用Spring Boot,这对于新手来说是个不错的选择,因为Spring Boot简化了配置,可以快速上手。数据库用MySQL,这很常见,但需要设计合理的表结构。前端方面,用户已经会用HTML/CSS/JS,可能需要一些框架如Vue.js或React,但用户可能更倾向于原生或者简单框架,比如Thymeleaf,因为Spring Boot整合Thymeleaf比较容易,适合新手。不过用户提到前端用HTML等,可能不需要复杂框架,但可能需要AJAX与后端交互。 考虑到用户学过Qt,可能对MVC模式有一定了解,可以类比到Spring Boot的结构。需要指导用户如何搭建Spring Boot项目,使用Maven或Gradle管理依赖,如何设计RESTful API,或者传统的MVC结构。另外,数据库部分需要设计ER图,使用MyBatis或Spring Data JPA来操作数据库,对于新手来说,JPA可能更简单,因为可以不用写太多SQL。 智能分配任务的功能需要根据地址来分配任务,可能需要计算距离或者根据区域划分。如果用户没有GIS的经验,可以简化处理,比如根据快递代收点的区域分配给附近的兼职用户,或者通过地址关键字匹配。这部分需要设计算法,可能在后端实现,可能需要数据库中的区域划分表。 接下来,我需要规划开发步骤,分阶段进行,比如先搭建环境,设计数据库,然后实现用户模块,再逐步添加其他角色功能。测试阶段需要单元测试和集成测试,可能使用JUnit和Postman。 在技术选型上,确保每个部分都有合适的工具和库,比如Spring Security用于安全认证,Lombok简化代码,Spring Data JPA操作数据库,Thymeleaf作为模板引擎。前端可能用Bootstrap快速构建界面,AJAX处理异步请求。 最后,需要给出学习路径,帮助用户快速掌握必要的Java和Spring Boot知识,比如推荐教程、文档,以及如何逐步实践。同时,在开发过程中注意模块化,分功能实现,避免复杂度太高。 可能遇到的问题包括Java语法不熟悉,Spring Boot配置问题,数据库设计不合理,或者前后端数据交互的问题。需要指导用户如何调试和解决这些问题,利用社区资源和文档。 总结来说,需要将整个开发过程分解为需求分析、系统设计、环境搭建、模块实现、测试优化等步骤,并为每个步骤推荐适合新手的技术栈和工具,确保用户能够逐步完成系统开发。</think>### 一、系统开发全流程规划(基于Java新手视角) #### 1. **需求分析与设计阶段(第1-4周)** - **需求细化**(第1周) - 用表格列出三个角色的所有功能点,明确优先级(核心功能优先) - 绘制**用例图**(如普通用户提交代取申请、兼职用户确认任务等) - **数据库设计**(第2周) - 核心表设计: - 用户表(`user`):区分普通用户/兼职用户/管理员(用`role`字段标记) - 快递表(`package`):关联用户ID、运单号、状态(到达/代取中/已领取) - 代取任务表(`task`):关联用户ID、代取人ID、地址、时间戳 - 评价表(`review`):关联用户ID、代取人ID、评分、反馈内容 - 示例ER图片段: ```plaintext user <--1:n--> package user <--1:n--> task task --n:1--> package ``` - **技术选型与学习路径**(第3-4周) - 优先掌握: - Java基础语法(对比C++差异:垃圾回收、接口等) - Spring Boot核心:`@RestController`, `@Service`, `@Repository` - MySQL基础CRUD与联表查询 #### 2. **技术栈推荐(新手友好型)** | 层级 | 技术/工具 | 选择理由 | |------------|--------------------|--------------------------------------------------------------------------| | **前端** | HTML/CSS + Bootstrap + jQuery | 无需复杂框架,Bootstrap快速构建响应式界面,jQuery简化DOM操作 | | **后端** | Spring Boot 2.x + Lombok | Lombok自动生成Getter/Setter,减少样板代码 | | **数据库** | MySQL 8 + Spring Data JPA | JPA提供ORM,避免手写SQL(对新手更友好) | | **工具** | IntelliJ IDEA + Postman | IDEA智能提示完善,Postman测试API接口 | #### 3. **模块开发步骤(第5-12周)** - **普通用户模块**(第5-6周) 1. 注册登录实现: - 使用Spring Security + JWT实现鉴权 - 短信验证码集成(阿里云/腾讯云SDK) 2. 快递代取服务: ```java // 示例Controller代码片段 @PostMapping("/submitTask") public ResponseEntity<?> submitTask(@RequestBody TaskRequest request) { // 验证用户权限 -> 保存任务到数据库 -> 触发智能分配 return ResponseEntity.ok("任务提交成功"); } ``` - **智能分配算法**(关键实现) - 简化方案:根据用户地址关键词匹配(如“A栋”对应兼职用户负责区域) - 数据库设计`区域分配表`(area_allocation): | 字段 | 类型 | 说明 | |--------------|-------------|--------------------| | area_keyword | VARCHAR(20) | 地址关键词(如“A栋”)| | worker_id | INT | 负责的兼职用户ID | - **兼职用户模块**(第7-8周) - 任务领取逻辑: ```sql -- 根据当前用户负责区域获取待分配任务 SELECT * FROM task WHERE address LIKE CONCAT('%', (SELECT area_keyword FROM area_allocation WHERE worker_id=#{workerId}), '%') AND status = '待领取'; ``` - **管理员模块**(第9-10周) - 可视化统计:集成ECharts展示任务量趋势图 - 使用Spring Boot Admin监控系统运行状态 #### 4. **测试与优化(第11-12周)** - **单元测试**:使用JUnit + Mockito测试Service层 - **压力测试**:JMeter模拟并发任务提交 - **典型问题解决**: - 代取冲突:使用数据库乐观锁(`@Version`注解) - 通知延迟:集成RabbitMQ实现异步消息队列 ### 二、Java新手学习路径建议 1. **Java速成(1周)** - 重点掌握:集合框架、异常处理、面向对象特性 - 资源推荐:廖雪峰Java教程(对比C++语法差异) 2. **Spring Boot入门(2周)** - 必实践: - 使用Spring Initializr生成项目骨架 - 实现一个包含CRUD的简单API(如TODO List) - 关键注解: - `@SpringBootApplication` - `@GetMapping`/`@PostMapping` - `@Autowired` 3. **数据库集成(1周)** - JPA实战: ```java // 示例Repository接口 public interface PackageRepository extends JpaRepository<Package, Long> { List<Package> findByUserId(Long userId); } ``` ### 三、风险规避建议 1. **技术风险**: - 提前验证第三方API(如短信服务) - 使用Flyway管理数据库版本变更 2. **进度风险**: - 优先实现核心链路:用户提交任务 → 智能分配 → 代取完成 → 评价 - 可选功能延后开发 附:**开发环境配置清单** - JDK 11(LTS版本稳定) - MySQL 8.x + Workbench - Node.js(仅需安装npm管理前端依赖) - Git代码版本控制
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值