2

考虑这个问题

现在有多种原因可以解释为什么创建线程很昂贵,特别是需要分配大量内存并且需要注册线程。

现在考虑这段代码:

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

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

4

3 回答 3

11

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

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

于 2013-01-28T19:20:49.283 回答
4

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

如果您发现应用程序存在性能问题,那么我鼓励您使用分析器来发现真正的性能问题。

于 2013-01-28T19:19:18.443 回答
1

如果您想避免创建线程的成本,请使用线程池。不过我同意@Gray。与连接池一样,线程池可以防止您一遍又一遍地创建事物(并且它可以防止线程数量不受控制地增长)。

于 2013-01-28T19:20:41.090 回答