【问题标题】:Is it expensive to create the Thread object or to actually start the thread?创建 Thread 对象或实际启动线程是否昂贵?
【发布时间】:2013-01-12 05:30:39
【问题描述】:

考虑this question

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

现在考虑这段代码:

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

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

【问题讨论】:

    标签: java multithreading


    【解决方案1】:

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

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

    【讨论】:

    • 不能再同意这个答案 - 不要明确管理您的线程,让执行程序框架为您完成。
    • 如果我在玩家连接时创建一个线程并在玩家断开连接时停止(中断)它,你会建议我使用什么执行器?而且,通过说,“你只需付出调用构造函数的代价。”你是在暗示第一行是两者中最贵的吗?
    • @MartinTuskevicius:查看Executors.newCachedThreadPool()。并且调用构造函数应该非常快,几乎是免费的。是start(),既耗时又耗内存。
    • 谢谢。这正是我所需要的。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 我知道这是一个相对较小的事情,但对我来说是改变两行的问题。我仍然想知道这两个选项中的哪个更好。
      猜你喜欢
      • 1970-01-01
      • 2016-10-28
      • 1970-01-01
      • 2016-11-05
      • 1970-01-01
      • 1970-01-01
      • 2014-01-14
      • 1970-01-01
      • 2011-08-03
      相关资源
      最近更新 更多