Java游戏服务器中定时任务的四种实现方式

Unity3D 如何实现游戏服务器定时任务详解 Unity3D是一种广泛应用于游戏开发的跨平台游戏引擎,它提供了丰富的功能和工具,可以轻松创建各种类型的游戏。在游戏开发过程中,经常需要使用定时任务来执行一些重复性的操作,比如刷新游戏中的资源、更新玩家数据等。本文将详细介绍如何在Unity3D中实现游戏服务器定时任务,并提供相应的技术详解和代码实现。在yield return语句后面的代码块中,可以编写定时任务的逻辑代码,比如刷新游戏中的资源、更新玩家数据等。本文介绍了在Unity3D中实现游戏服务器定时任务的两种方式:使用协程和使用定时器。 阅读详情

工作中研究过Java技术栈下几种常见的定时器实现,在此做个总结:

1. JDK提供的TimerTask

在游戏服务器中几乎不会使用它,因为有明显的缺点:

首先,它是单线程执行的,如果某个任务执行太长,可能会影响后续任务的准时执行。

其次,游戏中经常有修改系统时间测活动的需求,这种场景不适合。因为它底层是在schedule task的时候就算好了wait的时间,无法在系统时间修改后自动调整。

2. 循环 + PriorityQueue

最主流的实现方式,也是Netty等框架实现定时任务的方式。

基本思路是:开单独线程不断循环,每次sleep固定时间片,然后依次遍历任务队列中的任务,若到时间了就扔到业务线程池执行。任务维护在PriorityQueue的队列中,这种数据结构好处是插入的时间复杂度仅为O(logN),好于链表的O(N)。

因为不存在长时间阻塞,所以可以做到系统时间修改后任务时间自动调整。

3. 时间轮

适合于时间精度要求不高的场合,比如IO超时处理。

精度不高的原因是时间精度依赖于轮中的格子数,但如果格子数越多,空间消耗也会越大。本质上这是一个时间-空间trade off的问题。

时间轮在Netty、Kafka、Zookeeper等很多Java开源项目中都有广泛应用。仿照实现一个并不难。
因为需要一格格计算,所以无法做到系统时间修改后任务时间自动调整。

4. quartz

这种方式底层实现也是让线程sleep或wait,类似于方式1和2。

不过quartz本身提供了更高阶的功能:如crontab表达式,可以指定日期(如每日零点)定时执行;也能支持更复杂的触发逻辑,如延迟3秒后每1秒执行一次;还提供任务持久化功能,即使宕机后任务也能恢复。

quartz本质上是封装好的更重量级的任务调度方案,类似的还有xxl-job,后者还提供分布式和可视化监控的功能。不过对于游戏来说,quartz一般也够用了。

quartz可以做到系统时间修改后任务时间自动调整。通过quartz源码可以看到,调度线程每次wait不是直接到下个任务执行时间,而是30秒左右的随机值,这样反复wait直到任务执行的时间点。因此修改系统时间后,调度线程在当前wait时间结束后,能将任务执行时间重新调整。

long now = System.currentTimeMillis();
// 默认30秒加随机浮动
long waitTime = now + getRandomizedIdleWaitTime(); 
long timeUntilContinue = waitTime - now;
synchronized(sigLock) {
    try {
        if(!halted.get()) {
              // QTZ-336 A job might have been completed in the mean time and we might have
              // missed the scheduled changed signal by not waiting for the notify() yet
              // Check that before waiting for too long in case this very job needs to be
              // scheduled very soon
              if (!isScheduleChanged()) {
                  // 在主循环中反复执行wait,直到任务执行
                  sigLock.wait(timeUntilContinue); 
              }
        }
    } catch (InterruptedException ignore) {
    }
}

要注意的是,往后调系统时间没有问题,但如果是往回调时间,那么在调整前已过期的任务不会重新执行。例如,用crontab设置了每日0点执行,如果从某天1点调整到前一天23点,那么在经过0点时任务不会重新执行。

java游戏服务器业务之每日重置逻辑 大部分游戏都有每日重置的逻辑。关于每日重置,我们需要考虑两个问题。一个是如何区别在线玩家和离线玩家,一个是保证业务的线程安全的。本文提供一种方式,比较简单地实现了重置业务。 阅读详情

相关推荐

使用java定时器的几种方式

java中实现定时器的三种方式,qutarz+spring, spring-task, java Timer

Java -- 定时任务实现方式

定义Job有两种方式,@Servicetry {}}}第二种是继承,重写方法,这种方式可以接受JobDetail传递的参数@Overridetry {}// 获取参数System.out.println("参数:" + date);}}这样就把JobDetail和我们之前定义的QuartzJob关联起来了。...

MinggeQingchun的博客 3万+

告别切换烦恼!用Parallels Desktop的Host-Only网卡,在macOS上直接访问虚拟机里的公司内网

本文详细介绍了如何在macOS上使用Parallels Desktop的Host-Only网卡直接访问虚拟机内的公司内网,告别频繁切换操作系统的烦恼。通过配置Host-Only网络模式,实现主机与虚拟机的安全高效通信,特别适合需要频繁访问内网资源的IT从业者。文章包含分步指南、自动化脚本和常见问题解决方案,帮助用户优化工作流程。

weixin_28739079的博客 363

java实现定时器的方法

这里面包括了一个 timestamp数组,以及一个 time参数,这里需要注意的是 time参数,在 setTimeout方法中是一个不带参数的 time参数,这个 time参数是用来设置定时器数组所需的时间,而不是用来设置定时器的时间。首先,我们先创建一个空的变量。上面的代码中,我们可以看到在 setTimeout方法中,会给出一个时间的值,并且这个时间是由线程来执行的,所以我们可以根据这个时间值来设置线程的执行顺序。在定时器中,有一个重要的参数叫做 top ()方法,当我们调用它的时候会产生一个异常。

花生日记 3247

从零开始!在 Windows 上安装与配置 Dify

这篇博客将详细介绍如何在 Windows 系统上部署 Dify,适合零基础用户。从 Docker 和 WSL 的安装配置开始,逐步指导用户设置 Git、Docker 环境以及 Dify 配置文件,解决可能遇到的端口冲突等问题,最终完成 Dify 的启动和测试。通过简明易懂的步骤,帮助用户在本地成功运行 Dify,实现模型供应商配置,让 Dify 项目在 Windows 平台上顺利上线。

qq_49035156的博客 5万+

RT-Thread Studio与CubeMX联合编程(超级详细)

RT-Thread Studio与CubeMX联合编程 本文章参考以下文章: https://blog.youkuaiyun.com/qq_40824852/article/details/122596043 https://zhuanlan.zhihu.com/p/395106066 https://blog.youkuaiyun.com/m0_37697335/article/details/108890584 一、简介 经过上次对RT-Thread Studio的初步尝试,发现RT-Thread Studio中存在官方支

zhuzhu的博客 3万+

Java实现定时器

Java实现定时器的几种方法

沐雨橙风ιε的博客 3万+

Vscode + QT + CMake:高效开发环境搭建全攻略

本文详细介绍了如何搭建Vscode+QT+CMake高效开发环境,涵盖环境安装、配置优化及项目创建全流程。通过整合Vscode的轻量化编辑、QT的跨平台GUI开发以及CMake的现代构建管理,该组合特别适合大型QT项目和跨平台开发团队,能显著提升开发效率。

weixin_30338481的博客 504

Go游戏服务器之每日重置

每日重置是游戏的基本业务。这里分别介绍java与go实现的技术不同点,特别阐述两种语言是如何保证线程安全问题。

littleschemer的博客 1045

YOLOv12改进策略【Neck】| arXiv 2024 MAFPN:多分支辅助特征金字塔网络 | 通过双向辅助融合与异构卷积机制,解决传统PAFPN多尺度特征融合不充分与小目标检测不足问题

本文记录的是利用MAFPN颈部结构改进YOLOv12的目标检测网络模型。通过引入双向辅助融合机制优化特征处理流程,在自底向上路径利用 SAF 模块融合主干浅层特征与颈部输出,并保留浅层空间信息,为小目标检测提供更丰富细节;自顶向下路径通过 AAF 模块建立密集连接,聚合浅层高 / 低分辨率层、同级层及前层特征,均衡各层通道数后实现多向梯度信息交互,增强中 / 大目标特征表达。将其应用到中,解决传统特征金字塔在多尺度信息整合中的不足,提升多尺度目标检测的精度与特征表达的丰富性。Multi-Branch Aux

Limiiiing的博客 1256

YOLOv8【第一章:基础入门篇·第2节】一文搞定,数据集制作与标注完全指南!

🏆 本文收录于 《YOLOv8实战:从入门到深度优化》 专栏,该专栏专注于分享我在YOLOv8目标检测模型中的实战经验,涵盖从入门基础到深度优化的全方位解决方案。无论你是计算机视觉的新手,还是具有多年深度学习经验的专家,本专栏都将为你提供高效、可复现的技术方案,助你掌握YOLOv8的核心技术,提升目标检测性能,突破瓶颈,优化模型,并加速项目开发🚀!

**My Coding Family** 1507

终极指南:快速掌握iogame高性能Java游戏服务器框架

iogame是一款专为Java游戏服务器开发设计的高性能框架,通过创新的架构设计和极简的API,让开发者能够快速构建稳定可靠的游戏后端服务。本文将从项目概述到实战应用,为您全面解析这个革命性的游戏服务器解决方案。 ## 项目核心特性深度解析 iogame框架基于模块化设计理念,提供了完整的游戏服务器开发工具链。其核心特性包括: - **注解驱动开发**:通过简单的注解配置即可完成复杂的游戏逻

gitblog_00047的博客 720

YOLOv13结合Sobel边缘检测算子,实现EIEM(Edge Information Enhancement Module,边缘信息增强模块),强化空间特征提取

EIEM模块通过巧妙地结合Sobel边缘检测算子和现代卷积网络架构,实现了显式边缘信息增强的创新设计。这种方法不仅提高了网络对边缘特征的敏感性,还保持了良好的计算效率和模块化特性。 从技术实现角度看,EIEM展示了如何将经典计算机视觉算法无缝集成到深度学习框架中,为构建更强大、更可解释的视觉模型提供了新的思路。随着对边缘信息重要性认识的不断深入,以及对网络可解释性需求的增长,EIEM这样的显式特征增强模块将在未来的计算机视觉研究中发挥越来越重要的作用。

FJN110的博客 906

Java游戏服务器开发之十七--spring定时任务

    定时任务         这里我们直接使用spring的定时任务注解,Scheduled         修改的地方主要是2个,             添加                 ScheduledTask             修改                 ApplicationContext.xml                  先说下配置文件Applicat...

cmqwan的博客 8026

多周期路径约束(set_multicycle_path )

1.由慢到快的多周期约束 如下图所示,发射时钟周期是接受时钟周期的4倍。默认情况下,按照1T原则来进行静态时序分析和布局布线的。即建立时间是在发射沿后的第一个捕获沿检查,而保持时间是同一时刻下源时钟和捕获时钟的触发边沿下检查的(建立时间检查边沿的前一个触发沿)。 但是这样导致的问题就是该路径过于苛刻,为了满足这条路径的要求,不得不放弃其他路径。或者根本没办法保证这个默认的约束。总之最终造成...

Arist. 5506

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

传统软件服务器与游戏服务器架构区别

项目 智能客服 爬虫 SLG游戏 语言 java python kotlin 模型 异步事件驱动 可能没什么模型可言 actor模型 传输协议 http http tcp + netty 传输结构 json json protobuf 数据库 oracle,redis mongodb mysql,redis 数据库框架 mybatis python库(类似jdbc) hibernate 缓存架构 管理员登录状态用redis 可能只缓存了页码 所有游戏用的数据全部缓存,...

风萧古道的博客 8374

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

MCSManager终极指南:3步实现游戏服务器集群化部署与运维效率提升

MCSManager是一款专为游戏服务器设计的现代化分布式管理面板,通过其强大的Docker支持和多用户架构,能够帮助管理员轻松管理数百个游戏服务器实例。无论你是个人玩家还是专业运维团队,MCSManager都能将传统复杂的服务器部署流程简化为几个点击操作,实现运维效率的指数级提升。 ## 🎯 传统运维痛点 vs MCSManager解决方案 在传统游戏服务器管理中,管理员需要面对诸多挑战:

gitblog_00307的博客 477

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

PDFMathTranslate PDF 翻译指南:公式与排版完整保留,一条命令产出中英双语论文

PDFMathTranslate(命令名 `pdf2zh`)是一款免费开源的 PDF 翻译工具,核心卖点是保留排版:公式、图表、目录和注释都留在原位,翻译完成后你会得到两份新 PDF——纯中文版与中英双语对照版。项目已被 EMNLP 2025 Demo 收录,翻译引擎层支持 Google、DeepL、OpenAI、Ollama 等多种服务。 它解决的痛点很具体:外文论文逐句丢给网页翻译器,拼出来

gitblog_00315的博客 134

用FSCalendar实现iOS日期选择器:从零到一的新手实战指南

FSCalendar 是一款完全可定制的 iOS 日历控件库,同时兼容 Objective-C 与 Swift,累计下载量超过 50 万次,被 1 万多个 App 使用。无论你是做酒店预订、考勤打卡,还是电商活动页,它都能帮你用一个上午的时间,做出媲美系统级的日期选择器体验。本文将带你完成安装、搭建第一个日历控件、调整外观与处理选中事件,全程只需几行代码。 ## 一、FSCalendar 是什么

gitblog_00011的博客 309

MCSManager终极指南:快速部署600+游戏服务器的完整教程

MCSManager是一款开源的现代化游戏服务器管理面板,专为Minecraft、Steam游戏和其他各类游戏服务器设计。这个免费的管理工具提供了直观的Web界面,让你能够轻松管理和部署超过600种游戏服务器模板,无需复杂的命令行操作即可完成服务器搭建。 ## 🚀 项目简介与核心价值 MCSManager游戏服务器管理面板是一款分布式、多用户的管理系统,支持一键部署游戏服务器,大大降低了游戏

gitblog_00865的博客 153

MCSManager终极指南:如何5分钟快速部署600+游戏服务器

MCSManager是一款专为游戏服务器设计的现代化Web管理面板,它通过强大的应用市场功能让用户可以一键部署超过600种游戏服务器模板。无论你是想搭建Minecraft服务器、Steam游戏服务器,还是其他独立游戏服务器,这个开源工具都能在几分钟内帮你完成复杂的配置工作。对于新手用户和普通玩家来说,MCSManager提供了前所未有的简单体验,让游戏服务器管理变得像点击按钮一样轻松。 ## ?

gitblog_01068的博客 224

游戏服务器开发指南(八):合理应对异常

JDK中也有对fail-fast思想的运用,例如ArrayList是一个非线程安全的容器,如果在使用for-each遍历元素的同时又修改了它的结构,那么会第一时间抛出ConcurrentModificationException,快速而干净地失败,而不是冒着在未来不确定的时间出现不确定行为的风险。所以,对于这种影响全局的严重问题,不如在停服重启的时候就彻底解决好,解决了再对玩家开放服务器。合理地处理异常,能够将故障对玩家的影响降到最低水平,快速从错误中恢复,并提供充足的信息,避免以后再出现类似的问题。

长三月的游戏开发 1111

MCSManager终极指南:600+游戏服务器模板一键部署完全教程

你是否曾经因为搭建游戏服务器而感到头疼?繁琐的配置、复杂的命令行、各种兼容性问题...现在,这一切都将成为过去!MCSManager作为一款专业的游戏服务器管理面板,为你提供了600+预配置的游戏服务器模板,让游戏服务器部署变得前所未有的简单。 ## 🎮 从零开始:5分钟搭建你的第一个游戏服务器 ### 准备工作与环境安装 首先,你需要获取MCSManager的完整代码。打开终端,执行以下

gitblog_01127的博客 428

006-游戏逻辑

本文详细介绍了游戏服务器逻辑架构设计的关键技术,主要包括以下核心内容: 游戏逻辑架构 采用模块化设计,划分为启动模块、核心逻辑模块、网络模块等 实现清晰的层次结构,包括网络层、业务逻辑层、数据访问层 提供典型项目目录结构示例,实现代码组织规范化 逻辑处理流程 设计完整的请求处理流程,从网络接收、解码到业务处理 采用多线程池模型,分离游戏逻辑和IO操作 详细展示服务器启动和关闭的完整生命周期管理 事件系统 基于观察者模式实现松耦合的事件驱动架构 定义多种游戏事件类型(玩家登录、升级等) 实现事件监听器处理机制

小宝哥Code的专栏 937

Java游戏服务器框架flea-game:模块化架构与高并发实践

在游戏服务器开发领域,高并发处理与模块化架构是核心技术挑战。其原理在于通过非阻塞IO模型与分层设计,将网络通信、数据缓存、业务逻辑等核心功能解耦,以支撑海量玩家实时交互。这一技术价值在于显著降低开发复杂度,提升系统可维护性与扩展性,尤其适用于MMORPG、棋牌对战等需要处理大量并发连接和实时数据同步的应用场景。本文聚焦的flea-game框架,正是基于Netty实现了高性能网络通信层,并整合了多级缓存与热更新机制,为开发者提供了构建稳健游戏后台的通用工具箱。

weixin_28295799的博客 334

MCSManager:如何用一键模板系统快速搭建600+游戏服务器?

你是否曾经为搭建游戏服务器而头疼?从环境配置到参数调优,每一步都可能遇到各种问题。现在,MCSManager为你提供了一个革命性的解决方案——通过内置的应用市场模板系统,你可以快速部署超过600种游戏服务器,从热门的Minecraft到各类Steam游戏服务器,都能在几分钟内完成搭建。 MCSManager是一款现代化的分布式游戏服务器管理面板,专为Minecraft和Steam游戏服务器设计。

gitblog_00110的博客 235
上一篇: Netty 5新Buffer API详解
下一篇: Netty对JDK做了哪些定制和优化
长三月
博客等级 码龄9年 228粉丝 80原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值