创建Thread对象或实际启动线程是否昂贵?

时间:2013-01-28 19:17:41

标签: java multithreading

考虑this question

现在有很多原因导致创建线程的成本很高,特别是需要分配大量内存并且需要注册线程的事实。

现在考虑以下代码:

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

哪一部分是“昂贵的”部分?实际创建Thread对象的行还是启动线程的行?或两者?我之所以要问的原因是因为我正在编写游戏的服务器组件而且我在讨论是否应该在玩家连接后立即创建Thread对象并在玩家完成登录后启动线程,或者我应该同时在播放器完成登录后创建并启动线程。

3 个答案:

答案 0 :(得分:11)

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

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

答案 1 :(得分:4)

这真的让我过早优化。我真的怀疑你是否会在之前而不是之后的实例化或启动线程之间看到任何区别。如果它是100个线程,那么我可能会有不一样的感受。

如果您已经看到了应用程序的性能问题,那么我建议您使用分析器来发现真正的性能接收器。

答案 2 :(得分:1)

如果要避免创建线程的成本,请使用线程池。我同意@Gray。就像连接池一样,线程池可以防止你反复创建(并且它可以防止线程数量不受控制地增长)。