【问题标题】:Do creating threads in Java may be a bottleneck?在 Java 中创建线程可能是一个瓶颈吗?
【发布时间】:2011-12-11 16:03:53
【问题描述】:

对于连续任务,例如渲染动画,每帧创建短命线程会比在开始时创建线程然后暂停并恢复慢很多吗?

或者差异可以忽略不计?

【问题讨论】:

  • 不知道是不是语言的问题,但不能说会不会是瓶颈。如果您有一个非常慢的系统,这可能无关紧要,如果它是一个非常快的系统(或框架等),那么几个选项中最快的选项可能仍然是瓶颈?

标签: java multithreading performance


【解决方案1】:

那会慢很多;线程的开销很大。

您可以使用线程池来重用线程并避免开销。
但是,可能仍然不值得将线程用于此类短期任务,因为上下文切换的成本将超过收益。

测量一下!

【讨论】:

  • 我想我的应用程序中的线程并不像我建议的那样短暂。 Profiler 显示线程创建需要接近 0% 的时间,以确认我已经重写了我的代码以使用线程池 - 没有任何区别。
  • @mrpyo:线程创建不会显示在分析器中,因为它发生在新线程的操作系统中(设置和分配堆栈等)。它仍然很贵。 (AFAIK)
【解决方案2】:

创建新线程的开销很大。如果线程的活动非常短,则创建开销甚至可能大于实际执行时间。您将需要尽可能多地回收线程。

我推荐使用ExecutorService

【讨论】:

    【解决方案3】:

    由于创建开销,创建新线程并不是最好的方法。您至少应该使用线程池,而不是创建新线程(有关详细信息,请参阅Executor)。

    线程的生命周期也很重要。如果它太短,由于上下文切换开销,性能可能会更差。

    另一个重要的点是您拥有的 CPU/核心数。作为一般规则,如果您的任务是 CPU 密集型的(我假设这是您的情况),则每个内核应该使用 1-2 个线程。如果您的任务是 I/O 密集型任务,您可以稍微推动这个数字(比如 3-5 个线程)。

    【讨论】:

      猜你喜欢
      • 2011-03-24
      • 1970-01-01
      • 2010-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多