【问题标题】:Java: starting a new thread in a constructorJava:在构造函数中启动一个新线程
【发布时间】:2011-11-08 21:49:23
【问题描述】:

为什么在构造函数中启动一个新线程在 Java(或任何地方,就此而言)不受欢迎。我收到了来自 Netbeans 的警告,但它并没有给我任何重构建议。我正在编写一个客户端/服务器 Swing 应用程序,我正在启动的线程在服务器的 JFrame 构造函数中,以便持续监听客户端数据报。

为什么这不是好的做法,我应该如何避免?

【问题讨论】:

  • 放松,这是大学作业。需要 GUI 来显示当前使用服务器的客户端。

标签: java multithreading


【解决方案1】:

从构造函数启动一个线程可以让启动的线程在它被正确构造之前访问正在构造的对象,从而使一个未完全构造的对象可用于新线程。

您可以在构造函数中创建线程,并提供“启动”方法从外部启动线程。

或者您可以将构造函数和启动方法设为私有,并提供一个静态工厂方法来创建对象、启动线程并返回创建的对象。

【讨论】:

  • 我认为JB的解决方案是最好的。通过将构造函数设为私有来使构造函数不可用,并提供一个名为 createSomething 的静态工厂方法,它是类,然后在其上调用(也是)私有 init 方法,进而创建并可能启动线程。跨度>
  • 更不用说它使包含构造函数的类成为单元测试的噩梦
  • 如果启动线程是构造函数的最后一行,并且所有的实例变量赋值都发生了怎么办?那里还没有安全保障吗?
  • 有趣的是,java 自己的 java.util.Timer 从其构造函数创建并启动一个线程。
  • @JackmeriusTacktheritrix 正确,即使是构造函数的最后一行也没有安全保证。例如,如果有人要对相关类进行子类化:stackoverflow.com/a/10758741/4580653
【解决方案2】:

看看这个链接http://www.ibm.com/developerworks/java/library/j-jtp0618/index.html#code4

这与对 thissubclassing 的隐式引用有关。

【讨论】:

  • 答案是正确的,但您没有给出实际答案。引用 IBM 文章中的原因:“不要从构造函数中启动线程”应该会有所帮助。
【解决方案3】:

使类最终,也可能是一个解决方案,因为不会有子类。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-19
    • 1970-01-01
    • 2011-08-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多