运行 数千个线程,其中大部分都处于睡眠状态,资源昂贵吗?

Is running thousands of thread which contains mostly sleeps, resource-expensive?

我正在开发电报 api 机器人。

聊天组中的玩家将开始一个游戏,该游戏创建一个线程,该线程的任务是处理游戏流程。

机器人有不同的游戏可以玩,每个游戏都有不同的游戏处理。

例如,一款游戏是回合制游戏。机器人随机选择一个玩家,并告诉他们要做的事情(未讨论),当玩家的时间结束时(通常是一分钟),机器人将为其他玩家创建一个投票,玩家应该投票选择被选中的玩家做了他的正常工作。如果超过半数玩家接受,则此过程将对其他玩家重复,直到所有玩家都玩一次,然后游戏结束。

还有一些其他的游戏,这个只是介绍一下。

现在,父游戏 class(抽象)有一个 Thread getThread(); 方法,Childs 将覆盖该方法以 return 他们自己的游戏流程实现。

这个方法是不是太耗资源了?通常,从 10 到 500 个游戏同时获得 运行,并且线程花费的大部分时间是 Thread.sleep,这是性能劣势吗?

几乎所有使用 thread.sleep 的代码都将耗费资源(因为它轮询太频繁)或没有响应(因为它轮询的频率不够高)。

每次调用sleep(),OS需要调度不同的native线程给运行,然后执行线程切换。这不是一个便宜的操作。将其乘以每秒数千次线程切换,您将在开销中使用很大一部分 CPU 时间。

一种更高效、更灵敏的多线程方法是使用 wait / notify .... 或构建在 wait / notify 或等价物之上的更高级别的并发结构。

还有更高效的方法(例如 fork / join, or the reactor pattern),但它们需要以不同的方式思考您的问题。但是,如果您发现自己的实现架构需要成百上千个线程,您可能 do 需要重新考虑。每个线程仅通过现有就使用大量资源(例如内存)。