gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 05:07:47 24 4
gpt4 key购买 nike

我正在用 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 个。

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

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

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

所以我想问是否值得花时间稍微重新组织教程以便它们共享一个线程,或者让事情保持原样是否有意义。

谢谢!

最佳答案

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

线程调度程序将 CPU 时间从一个线程分配给另一个线程的过程称为 context switch这需要一些时间。此外,当您创建一个新线程时,您会为其堆栈分配一些内存。考虑到这一点,有很多(比如说 50 个)线程是不好的,因为:

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

你最终会得到很多线程,大部分时间它们什么都不做,只是在浪费资源。那么,解决方案是什么?您可以使用 ExecutorService,而不是每次需要异步执行某些任务时都创建新线程,有一个不错的 article在那上面。另外,查看您的代码,您似乎正在执行循环任务。如果是这样,您可以使用 Timer类,只需创建 TimerTaskschedule it at fixed rate .

关于java - 拥有大量(20+)简单线程是否有危险?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29803593/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com