Java 创建线程对象或实际启动线程的成本高吗?

Java 创建线程对象或实际启动线程的成本高吗?,java,multithreading,Java,Multithreading,考虑一下 现在有各种各样的原因来解释为什么创建线程是昂贵的,特别是需要分配大量内存和注册线程这一事实 现在考虑这个代码: Thread thread = new Thread(new SomeRunnable()); thread.start(); 哪一部分是“昂贵”的部分?实际创建线程对象的行还是启动线程的行?或者两者都有?我问这个问题的原因是因为我正在编写游戏的服务器组件,我正在讨论是否应该在玩家连接后立即创建线程对象,并在玩家完成登录后启动线程,或者我应该在玩家完成登录后创建并启动线程。

考虑一下

现在有各种各样的原因来解释为什么创建线程是昂贵的,特别是需要分配大量内存和注册线程这一事实

现在考虑这个代码:

Thread thread = new Thread(new SomeRunnable());
thread.start();

哪一部分是“昂贵”的部分?实际创建线程对象的行还是启动线程的行?或者两者都有?我问这个问题的原因是因为我正在编写游戏的服务器组件,我正在讨论是否应该在玩家连接后立即创建线程对象,并在玩家完成登录后启动线程,或者我应该在玩家完成登录后创建并启动线程。

这对我来说真的有点过早优化的味道。我真的怀疑您是否会看到更早而不是更晚实例化或启动线程之间的区别。如果是100个线程,那么我可能会有不同的感觉


如果您发现应用程序存在性能问题,那么我建议您使用探查器来发现真正的性能接收器。

如果您希望避免线程创建成本,请使用线程池。不过我同意格雷的说法。与连接池一样,线程池可以防止您一次又一次地创建东西(并且可以防止线程数量不可控地增长)。

创建
线程对象非常便宜。你只需付出调用构造函数的代价。占用空间的是
start()
方法(本机调用、堆栈内存等)


另一方面,如果你创建了大量的线程,考虑预先创建(并启动它们)并拥有一个池。这已经为您完成了,请查看课程。

我知道这是一件相对较小的事情,但我只需要更改两行即可。我仍然想知道这两个选项中更好的一个。我不能更同意这个答案-不要显式地管理线程,让executors框架为你做。如果我在播放器连接时创建线程,在播放器断开连接时停止(中断),你建议我使用什么执行器?还有,通过说,“你只需支付调用构造函数的费用。”你是在暗示第一行是两行中最昂贵的一行吗?@MartinTuskevicius:看看。调用构造函数应该非常快,几乎是免费的。需要花费时间和内存的是
start()
。谢谢。这正是我需要的。