拥有大量(20+)简单线程是否存在危险?

时间:2015-04-22 16:26:36

标签: java multithreading

我正在用Java编写游戏。我有游戏中的教程。每个教程基本上都是一个5-10帧的动画,每秒都在变化。

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

int sleepTimeMillis = 1000;
public static void run() {
    while ( true ) {
        try {
            tutorialFrame = ( tutorialFrame + 1 ) % numberOfFrames;
            Thread.sleep ( sleepTimeMillis );
        catch ( InterruptedException e ) {}
    }
}

我目前有大约10个正在运行。当我完成所有这些时,我想我将有大约50岁。

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

不出所料,我没有通过添加这些线程注意到游戏中的任何速度问题。话虽这么说,我对在流程中拥有多个线程的幕后开销并不了解。

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

所以我问是否值得花时间重新构建教程,以便他们共享一个帖子,或者只是留下它们是如何有意义的。

谢谢!

2 个答案:

答案 0 :(得分:3)

线程很棘手。人们第一次学习线程概念,他们认为:“太棒了,现在我可以并行运行所有东西!我会尽可能地在所有地方使用线程!”。但是有一些陷阱。让我们从具有多个核心的CPU开始。对于第一个近似值,可以同时运行的线程数等于核心数(欢迎使用详细注释,如hyperthreading)。因此,如果您创建了100个线程,则只能在具有4个核心的计算机上同时执行4个线程。并且有一个线程调度程序,它调度线程以便执行。

线程调度程序从一个线程到另一个线程提供CPU时间的过程称为context switch并且需要一些时间。而且,当您创建一个新线程时,您为其堆栈分配了一些内存。考虑到这一点,有很多(比如50个)线程是坏的,因为:

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

你最终会拥有许多线程,大部分时间都不会做任何事情,只会浪费资源。那么,解决方案是什么?每次需要异步执行某个任务时,您可以使用ExecutorService,而不是创建新的线程,有一个很好的article。此外,查看您的代码,看起来您正在执行循环任务。如果是,您可以使用Timer课程,只需创建TimerTaskschedule it at fixed rate

答案 1 :(得分:0)

将教程作为精灵并使用Sprites Update和绘制方法会更有效。这样你只使用一个线程来更新所有内容。拥有多个线程的工作是浪费。