首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >有大量的简单线程(20+)有危险吗?

有大量的简单线程(20+)有危险吗?
EN

Stack Overflow用户
提问于 2015-04-22 16:26:36
回答 2查看 108关注 0票数 1

我在用Java写游戏。我有游戏教程。每个教程本质上是一个5-10帧动画,每秒钟变化一次.

对于每个教程,我都有一个简单的线程在运行:

代码语言:javascript
运行
复制
int sleepTimeMillis = 1000;
public static void run() {
    while ( true ) {
        try {
            tutorialFrame = ( tutorialFrame + 1 ) % numberOfFrames;
            Thread.sleep ( sleepTimeMillis );
        catch ( InterruptedException e ) {}
    }
}

我现在有大约10个这样的跑步。当我把它们全部吃完的时候,我想我会有大约50个。

否则,我的游戏就会使用一些线程:一个用于窗口环境,一个用于游戏逻辑,一个用于呈现引擎,可能还有一些其他的小线程。

毫不奇怪,我没有注意到任何速度问题在游戏中添加这些线程。话虽如此,我对进程中有许多线程的幕后开销并不了解。

如果希望减少这些教程线程的数量,我可以以不同的方式重构程序。

所以,我想问的是,是否值得花点时间来重新构建教程,让它们都共享一个线程,还是只保留它们的原样是否有意义。

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-04-22 18:44:40

线是很棘手的。当人们第一次学习线程概念时,他们想:“太棒了,现在我可以并行运行所有的东西了!我将尽可能多地使用线程!”但也有陷阱。让我们从CPU开始,它有多个核。首先,可以同时运行的线程数量等于内核的数量(欢迎对此进行详细评论,如超线程 )。因此,如果您创建了100个线程,那么只有4个可以同时在具有4个内核的机器上执行。还有一个线程调度器,它为执行安排线程。

当线程调度程序给CPU从一个线程到另一个线程的时间时,这个进程称为上下文切换,它需要一些时间。此外,当您创建一个新线程时,您会为其堆栈分配一些内存。考虑到这一点,有许多线程(比如50个线程)是不好的,因为:

  • 你正在使用额外的内存。在x64机器上,默认的线程堆栈大小是1MB。50个线程= 50 MB
  • context switch发生得太频繁了,您正在浪费时间。

最后会有很多线程,大多数时候什么都不做,只会浪费资源。那么,解决办法是什么?与每次需要异步执行某些任务时创建新线程不同,您可以使用ExecutorService,这上面有一个很好的文章。此外,看看您的代码,它看起来就像是在执行重复的任务。如果是这样,您可以使用计时类,只需创建TimerTask按固定费率安排

票数 3
EN

Stack Overflow用户

发布于 2015-04-22 16:30:51

让您的教程成为精灵并使用sprites更新和绘图方法更有效。这样,您只需要使用一个线程来更新所有内容。多用一根线做这项工作是一种浪费。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29803593

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档