当前位置: 首页 > news >正文

【CompletableFuture任务编排】游戏服务器线程模型及其线程之间的交互(以排行榜线程和玩家线程的交互为例子)

需求:

1.我们希望玩家的业务在玩家线程执行,无需回调,因此是多线程处理。

2.匹配线程负责匹配逻辑,是单独一个线程。

3.排行榜线程负责玩家的上榜等。

4.从排行榜线程获取到排行榜列表后,需要给玩家发奖修改玩家数据,因此涉及到排行榜线程和玩家线程的交互。

5.房间线程也希望有多个,这样子各个房间之间业务无交互,进行并行执行。

ThreadManager.java // 负责所有线程的创建

package org.example.testLogicAndRank;import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class ThreadManager {/*** 逻辑专用线程*/public static ExecutorService[] logicThreadArr;/*** 房间专用线程*/public static ExecutorService[] roomThreadArr;/*** 排行榜专用线程*/public static ExecutorService rankExecutorService = Executors.newSingleThreadExecutor(r -> {Thread t = new Thread(r);t.setName("RankThread");return t;});/*** 匹配专用线程*/public static ExecutorService matchExecutorService = Executors.newSingleThreadExecutor(r -> {Thread t = new Thread(r);t.setName("RankThread");return t;});public static void init() {// 逻辑线程池logicThreadArr = new ExecutorService[Runtime.getRuntime().availableProcessors()];for (int i = 0; i < logicThreadArr.length; i++) {int finalI = i;logicThreadArr[i] = Executors.newSingleThreadExecutor(r -> {Thread t = new Thread(r);t.setName("LogicThread" + finalI);return t;});}// 房间线程池roomThreadArr = new ExecutorService[Runtime.getRuntime().availableProcessors()];for (int i = 0; i < roomThreadArr.length; i++) {int finalI = i;roomThreadArr[i] = Executors.newSingleThreadExecutor(r -> {Thread t = new Thread(r);t.setName("RoomThread" + finalI);return t;});}}
}

LogicThreadManager.java //逻辑线程池

package org.example.testLogicAndRank;import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutorService;
import java.util.function.Consumer;public class LogicThreadManager {/*** 从其他线程执行一个任务,然后将结果提交到逻辑线程** @param completableFuture* @param consumer* @param <T>*/public static <T> void executeInLogicThread(CompletableFuture<T> completableFuture, Consumer<T> consumer, Object hashObj) {ExecutorService executorService = ThreadManager.logicThreadArr[Math.abs(hashObj.hashCode()) % ThreadManager.logicThreadArr.length];completableFuture.thenAcceptAsync(consumer, executorService);}
}

RankThreadManager.java

package org.example.testLogicAndRank;import com.google.common.collect.Lists;
import lombok.extern.slf4j.Slf4j;import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.CompletableFuture;@Slf4j
public class RankThreadManager {public static CompletableFuture<List<Integer>> getRankList() {return submitInRankThread(() -> {// 查询数据库log.info("查询排行榜");return Lists.newArrayList(1, 2, 3, 4, 5);});}/*** 在排行榜线程执行某个操作,有返回值** @param callable* @param <T>* @return*/public static <T> CompletableFuture<T> submitInRankThread(Callable<T> callable) {return CompletableFuture.supplyAsync(() -> {try {return callable.call();} catch (Exception e) {log.error("", e);}return null;}, ThreadManager.rankExecutorService);}/*** 在排行榜线程执行某个操作,无返回值*/public static void executeInRankThread(Runnable runnable) {ThreadManager.rankExecutorService.submit(runnable);}
}

Main.java

package org.example.testLogicAndRank;import lombok.extern.slf4j.Slf4j;import java.util.List;
import java.util.concurrent.CompletableFuture;@Slf4j
public class Main {public static void main(String[] args) {ThreadManager.init();// 排行榜CompletableFuture<List<Integer>> rankListFuture = RankThreadManager.getRankList();// 假设是给玩家1和2发奖LogicThreadManager.executeInLogicThread(rankListFuture, (rankList) -> {log.info("拿到排行榜数据发奖{}", rankList);}, 1);LogicThreadManager.executeInLogicThread(rankListFuture, (rankList) -> {log.info("拿到排行榜数据发奖{}", rankList);}, 2);}
}/*
17:16:39.314 [RankThread] INFO org.example.testLogicAndRank.RankManager - 查询排行榜
17:16:39.343 [LogicThread2] INFO org.example.testLogicAndRank.Main - 拿到排行榜数据发奖[1, 2, 3, 4, 5]
17:16:39.343 [LogicThread1] INFO org.example.testLogicAndRank.Main - 拿到排行榜数据发奖[1, 2, 3, 4, 5]*/

总结:

可以看出来,我们不再需要什么Promise模式了,有了CompletableFuture后,业务线程的编排和交换数据变得非常容易了!

相关文章:

【CompletableFuture任务编排】游戏服务器线程模型及其线程之间的交互(以排行榜线程和玩家线程的交互为例子)

需求&#xff1a; 1.我们希望玩家的业务在玩家线程执行&#xff0c;无需回调&#xff0c;因此是多线程处理。 2.匹配线程负责匹配逻辑&#xff0c;是单独一个线程。 3.排行榜线程负责玩家的上榜等。 4.从排行榜线程获取到排行榜列表后&#xff0c;需要给玩家发奖修改玩家数…...

什么是浏览器指纹?详解浏览器指纹识别技术,教你防止浏览器指纹识别

在数字时代&#xff0c;我们的在线活动几乎总是留下痕迹。其中&#xff0c;浏览器指纹就像我们的数字身份证&#xff0c;让网站能够识别和追踪用户。对于跨境电商行业来说&#xff0c;了解这种追踪技术尤其重要&#xff0c;因为它可能影响账号的管理和安全。本文将详细介绍浏览…...

canvas绘制六芒星

查看专栏目录 canvas实例应用100专栏&#xff0c;提供canvas的基础知识&#xff0c;高级动画&#xff0c;相关应用扩展等信息。canvas作为html的一部分&#xff0c;是图像图标地图可视化的一个重要的基础&#xff0c;学好了canvas&#xff0c;在其他的一些应用上将会起到非常重…...

全网最详细!!Python 爬虫快速入门

1. 背景 最近在工作中有需要使用到爬虫的地方&#xff0c;需要根据 Gitlab Python 实现一套定时爬取数据的工具&#xff0c;所以借此机会&#xff0c;针对 Python 爬虫方面的知识进行了学习&#xff0c;也算 Python 爬虫入门了。 需要了解的知识点&#xff1a; Python 基础语…...

gitgud.io+Sapphire注册账号教程

gitgud.io是一个仓库&#xff0c;地址 https://gitgud.io/&#xff0c;点进去之后会看到注册页面。 意思是需要通过注册这个Sapphire账户来登录。点击右边的Sapphire&#xff0c;就跳转到Sapphire的登陆页面&#xff0c;点击创建新账号&#xff0c;就进入注册页面。&#xff0…...

【动态规划】【广度优先搜索】【状态压缩】847 访问所有节点的最短路径

作者推荐 视频算法专题 本文涉及知识点 动态规划汇总 广度优先搜索 状态压缩 LeetCode847 访问所有节点的最短路径 存在一个由 n 个节点组成的无向连通图&#xff0c;图中的节点按从 0 到 n - 1 编号。 给你一个数组 graph 表示这个图。其中&#xff0c;graph[i] 是一个列…...

python基础小知识:引用和赋值的区别

嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 1.引用 python中&#xff0c;赋值操作会产生相同对象的多个引用&#xff0c; 如果在原位置修改这个可变对象时&#xff0c;可能会影响程序其他位置对这个对象的…...

欧科云链与《警察技术》联合发布技术专题.pdf

欧科云链受《警察技术》邀请&#xff0c;于第201期期刊正式刊登“区块链生态安全与虚拟货币犯罪治理”技术专题。欧科云链作为该技术专题主要作者&#xff0c;直接参与本次期刊2篇文章撰写&#xff0c;同时为多篇文章提供欧科云链的最新数据和研究成果。 《警察技术》期刊创办于…...

【QT+QGIS跨平台编译】之一:【sqlite+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

文章目录 一、sqlite3介绍二、文件下载三、文件分析四、pro文件五、编译实践 一、sqlite3介绍 SQLite是一款轻型的数据库&#xff0c;是遵守ACID的关系型数据库管理系统&#xff0c;它包含在一个相对小的C库中。它是D.RichardHipp建立的公有领域项目。它的设计目标是嵌入式的&…...

websocket实现聊天室(vue2 + node)

通过websocket实现简单的聊天室功能 需求分析如图&#xff1a; 搭建的项目结构如图&#xff1a; 前端步骤&#xff1a; vue create socket_demo (创建项目)views下面建立Home , Login组件路由里面配置路径Home组件内部开启websocket连接 前端相关组件代码&#xff1a; Login…...

RabbitMQ-消息延迟

一、死信交换机 1、描述 一个队列接收到的消息有过期时间&#xff0c;消息过期之后&#xff0c;如果配置有死信队列&#xff0c;消息就会进去死信队列。 2、图解 3、过程 当生产者将消息发送到exchange1&#xff0c;然后交换机将消息路由到队列queue1&#xff0c;但是队列que…...

【Oracle】如何给物化视图分区

文章目录 【Oracle】如何给物化视图分区给物化视图进行分区的例 【声明】文章仅供学习交流&#xff0c;观点代表个人&#xff0c;与任何公司无关。 编辑|SQL和数据库技术(ID:SQLplusDB) 收集Oracle数据库内存相关的信息 【Oracle】ORA-32017和ORA-00384错误处理 【Oracle】设置…...

10个常考的前端手写题,你全都会吗?

前言 &#x1f4eb; 大家好&#xff0c;我是南木元元&#xff0c;热爱技术和分享&#xff0c;欢迎大家交流&#xff0c;一起学习进步&#xff01; &#x1f345; 个人主页&#xff1a;南木元元 今天来分享一下10个常见的JavaScript手写功能。 目录 1.实现new 2.call、apply、…...

vue组件间通信

Vue组件之间通信方式有哪些 一、父子组件通讯 1、props&#xff0c;emit 父组件可以通过props给子组件传递变量。子组件可以通过emit派发自定义事件&#xff0c;使父组件可以获得事件函数传递过来的形参。 2、$parent、$children、ref 父组件可以通过 c h i l d r e n 获取…...

编程框架概述:MVC, MVP, MVVM, Flux/Redux, 和 Clean Architecture

前言 在软件开发中&#xff0c;选择合适的编程框架和架构模式对于构建可维护和可扩展的应用程序至关重要。初学者在面对多种架构选项时可能会感到困惑。本文将详细介绍五种流行的编程框架&#xff1a;MVC、MVP、MVVM、Flux/Redux和Clean Architecture。 MVC&#xff08;Model-V…...

多维时序 | Matlab实现CNN-BiLSTM-Mutilhead-Attention卷积双向长短期记忆神经网络融合多头注意力机制多变量时间序列预测

多维时序 | Matlab实现CNN-BiLSTM-Mutilhead-Attention卷积双向长短期记忆神经网络融合多头注意力机制多变量时间序列预测 目录 多维时序 | Matlab实现CNN-BiLSTM-Mutilhead-Attention卷积双向长短期记忆神经网络融合多头注意力机制多变量时间序列预测效果一览基本介绍程序设计…...

np.argsort排序问题(关于位次)-含GitHub上在numpy项目下提问的回复-总结可行方案

np.argsort 与获取位相关问题 位次: 数组中的数据在其排序之后的另一个数组中的位置 [1,0,2,3] 中 0的位次是1 1的位次是2 2的位次是3 3的位次是4 这里先直接给出结论&#xff0c;np.argsort()返回的索引排序与实际位次在确实在某些情况下会出现一致&#xff0c;但后来numpy的开…...

Element中的el-input-number+SpringBoot+mysql

1、编写模板 <el-form ref"form" label-width"100px"><el-form-item label"商品id&#xff1a;"><el-input v-model"id" disabled></el-input></el-form-item><el-form-item label"商品名称&a…...

Jupyter Notebook五分钟基础速通

1 作用 常用于数据分析 2 安装 2.1 Anaconda 通过直接安装Anaconda&#xff0c;会自动安装Jupyter Notebook 2.2 命令行安装 ① 3.x版本 pip3 install --upgrade pip pip3 install jupyter ② 2.x版本 pip install --upgrade pip pip install jupyter 3 启动 cmd窗口下…...

基于SpringBoot的SSM整合案例

项目目录: 数据库表以及表结构 user表结构 user_info表结构 引入依赖 父模块依赖: <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.2.12.RELEASE</version>…...

Virtuoso ADE仿真避坑指南:你的时钟占空比测对了吗?详解dutyCycle函数threshold参数设置

Virtuoso ADE仿真避坑指南&#xff1a;时钟占空比测量的关键参数解析 在模拟电路设计中&#xff0c;时钟信号的占空比精度往往直接影响系统性能。许多工程师虽然熟悉Virtuoso ADE的基础操作&#xff0c;却在自动测量占空比时遭遇"数据看起来合理但实际存在偏差"的困境…...

驾驭AI引用:Geo优化中的内容评分机制与实战策略深度解析

在生成式人工智能&#xff08;Generative AI&#xff09;日益主导信息获取与分发路径的时代&#xff0c;传统搜索引擎优化&#xff08;SEO&#xff09;的范式正被生成式引擎优化&#xff08;Geo&#xff09;所颠覆。Geo不再仅仅关注关键词排名&#xff0c;而是深入探究内容如何…...

农业气象监测系统—实时感知・远程管控・智能预警

在农业现代化向纵深推进的当下&#xff0c;气象数据已成为农业生产的 “核心指挥棒”。烟台中盾信息科技有限公司&#xff08;下称 “烟台中盾科技”&#xff09;紧扣农业农村发展需求&#xff0c;以物联网、大数据技术为基石&#xff0c;打造农业气象监测系统&#xff0c;构建…...

Realistic Vision V5.1 创意工作流:利用GitHub管理提示词库与生成作品版本

Realistic Vision V5.1 创意工作流&#xff1a;利用GitHub管理提示词库与生成作品版本 你有没有遇到过这种情况&#xff1f;团队里每个人都在用Realistic Vision V5.1生成图片&#xff0c;但大家用的提示词五花八门&#xff0c;好的描述词散落在各个聊天记录里&#xff0c;生成…...

Charticulator:颠覆式图表构建引擎如何让数据工作者实现零代码可视化创新

Charticulator&#xff1a;颠覆式图表构建引擎如何让数据工作者实现零代码可视化创新 【免费下载链接】charticulator Interactive Layout-Aware Construction of Bespoke Charts 项目地址: https://gitcode.com/gh_mirrors/ch/charticulator 数据可视化领域长期面临着模…...

SpringBoot+Vue社区老年人帮扶系统源码+论文

代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339; 分享万套开题报告任务书答辩PPT模板 作者完整代码目录供你选择&#xff1a; 《SpringBoot网站项目》1800套 《SSM网站项目》1500套 《小程序项目》1600套 《APP项目》1500套 《Python网站项目》…...

5分钟搞定!Fun-ASR-MLT-Nano-2512多语言语音识别一键部署指南

5分钟搞定&#xff01;Fun-ASR-MLT-Nano-2512多语言语音识别一键部署指南 1. 快速了解Fun-ASR-MLT-Nano-2512 Fun-ASR-MLT-Nano-2512是阿里通义实验室推出的轻量级多语言语音识别模型&#xff0c;特别适合需要本地化部署的场景。这个800M参数的模型虽然小巧&#xff0c;但功能…...

毕设程序java师生交流系统的设计与实现 基于Java的师生互动教学平台设计与实现 基于SpringBoot的在线教育沟通系统开发

毕设程序java师生交流系统的设计与实现343xt8ar&#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。随着信息技术的飞速发展&#xff0c;传统的教育模式正在经历一场深刻的变革。互联…...

MAA明日方舟自动化助手:5分钟快速上手指南

MAA明日方舟自动化助手&#xff1a;5分钟快速上手指南 【免费下载链接】MaaAssistantArknights 一款明日方舟游戏小助手 项目地址: https://gitcode.com/GitHub_Trending/ma/MaaAssistantArknights MAA&#xff08;MaaAssistantArknights&#xff09;是一款专为《明日方…...

一文读懂:智能体身份权限治理演进实录

序章当一个实验性的“咖啡外卖”智能体&#xff08;BrewSense&#xff09;&#xff0c;从服务几位工程师的小工具&#xff0c;演变为数千人依赖的自动化伙伴时&#xff0c;会发生什么&#xff1f;这不仅仅是用户量和调用量的激增&#xff0c;更是一场关于身份、权限与信任的治理…...